#include <cstdlib>
#include <iostream>
#include <vector>
#include <stdio.h>

using namespace std;
long long int b,c;
long long int mrv[500][500];
long long int dv[500][500];
long long int zbir[250000];
long long int izlaz[250000];
vector<long long int> output;


int main(int argc, char *argv[])
{
    FILE *in,*out;
    in=fopen("mrvice.in","r");
    out=fopen("mrvice.out","w");
    int n,q;
    fscanf(in,"%d %d",&n, &q);
    zbir[0]=0;
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            {
                fscanf(in,"%lld",&mrv[i][j]);
                dv[i][j]=0;
                zbir[0]+=mrv[i][j];
            }
    int count=1,outCnt=0;
    for(int p=0; p<q; p++)
        {
         int a;
         fscanf(in,"%d",&a);
         fscanf(in,"%lld",&b);
         fscanf(in,"%lld",&c);
         if(a==1)
          {
              zbir[count]=0;
              if(b==0)
               {
                   int pos=0;
                   while(dv[pos][c-1]!=dv[pos][c] && pos<n) pos++;
                   int cut=dv[c-1][pos];
                   while(((dv[pos][c]==cut && dv[pos][c-1]==cut) || pos==0) && pos<n)
                       {
                           for(int i=c+1; i<n && dv[pos][i]==dv[pos][c]; i++)
                               {
                                   zbir[count]+=mrv[pos][i];
                                   zbir[dv[pos][c]]-=mrv[pos][i];
                                   dv[pos][i]=count;
                               }
                           zbir[count]+=mrv[pos][c];
                           zbir[dv[pos][c]]-=mrv[pos][c];
                           dv[pos][c]=count;
                           pos++;
                       }
                   if(zbir[count]>0) count++;
                   //printf("%d\n",pos);
               }
              else if(b==1)
               {
                   int pos=n-1;
                   while(dv[c-1][pos]!=dv[c][pos] && pos>=0) pos--;
                   int cut=dv[c-1][pos];
                   while(((dv[c][pos]==cut && dv[c-1][pos]==cut) || pos==n-1) && pos>=0)
                       {
                           for(int i=c+1; i<n && dv[i][pos]==dv[c][pos]; i++)
                               {
                                   zbir[count]+=mrv[i][pos];
                                   zbir[dv[c][pos]]-=mrv[i][pos];
                                   dv[i][pos]=count;
                               }
                           zbir[count]+=mrv[c][pos];
                           zbir[dv[c][pos]]-=mrv[c][pos];
                           dv[c][pos]=count;
                           pos--;
                       }
                   if(zbir[count]>0) count++;
                   //printf("%d\n",pos);
               }
              else if(b==2)
               {
                   int pos=n-1;
                   while(dv[pos][c-1]!=dv[pos][c] && pos>=0) pos--;
                   int cut=dv[c-1][pos];
                   while(((dv[pos][c]==cut && dv[pos][c-1]==cut) || pos==n-1) && pos>=0)
                       {
                           for(int i=c+1; i<n && dv[pos][i]==dv[pos][c]; i++)
                               {
                                   zbir[count]+=mrv[pos][i];
                                   zbir[dv[pos][c]]-=mrv[pos][i];
                                   dv[pos][i]=count;
                               }
                           zbir[count]+=mrv[pos][c];
                           zbir[dv[pos][c]]-=mrv[pos][c];
                           dv[pos][c]=count;
                           pos--;
                       }
                   if(zbir[count]>0) count++;
                   //printf("%d\n",pos);
               }
              else if(b==3)
               {
                   int pos=0;
                   while(dv[c-1][pos]!=dv[c][pos] && pos<n) pos++;
                   int cut=dv[c-1][pos];
                   while(((dv[c][pos]==cut && dv[c-1][pos]==cut) || pos==0) && pos<n)
                       {
                           for(int i=c+1; i<n && dv[i][pos]==dv[c][pos]; i++)
                               {
                                   zbir[count]+=mrv[i][pos];
                                   zbir[dv[c][pos]]-=mrv[i][pos];
                                   dv[i][pos]=count;
                               }
                           zbir[count]+=mrv[c][pos];
                           zbir[dv[c][pos]]-=mrv[c][pos];
                           dv[c][pos]=count;
                           pos++;
                       }
                   if(zbir[count]>0) count++;
                   //printf("%d\n",pos);
               }
          }
         else if(a==2)
             {
                 int cnt=0;
                 for(int i=0; i<count; i++)
                      if(zbir[i]>=b && zbir[i]<=c) cnt++;
                 /*for(int i=0; i<count; i++) printf("%d ",zbir[i]);
                 printf("\n");
                 printf("%d\n",cnt);*/
                 //output.push_back(cnt);
                 izlaz[outCnt]=cnt;
                 outCnt++;
             }
         /*for(int i=0; i<n; i++)
         {
             for(int j=0; j<n; j++) printf("%d ", div[i][j]);
             printf("\n");
         }*/
         /*for(int i=0; i<count; i++) printf("%d ",zbir[i]);
         printf("\n");*/
        }
    for(int i=0; i<outCnt; i++) fprintf(out,"%lld\n",izlaz[i]);
    fclose(in);
    fclose(out);
    return 0;
}

/*
4 6
3 12 8 5
4 1 2 9
7 6 6 3
10 4 2 8
1 2 1
1 3 3
2 9 15
1 3 3
2 13 14
2 17 100
*/
