#include<iostream>

using namespace std;




bool pravougaonik(int x[][2000],int i,int j,int b,int c){
int a,g;
int ind=x[i][j];
for(a=i+1;a<=b;a++){
    for(g=j+1;g<=c;g++){
      if(x[a][g]!=ind)
        return false;
    }
}
return true;
}




void izbrisi(int x[][2000],int i,int j,int n){
int a,b,c;
c=x[i][j];
for(a=0;a<n;a++){
    for(b=0;b<n;b++){
      if(x[a][b]==c)
        x[a][b]=0;
}
}
}


int main(){
 int n,i,j,k,b,c,a,zbir,indikator,ind,y,z,e,f;
 cin>>n;
 cin>>k;
 zbir=0;
 int x[n][2000];
 int sorta[k+1];
 for(e=0;e<=k;e++)
    sorta[e]=0;
for(i=0;i<n;i++){
    for(j=0;j<n;j++){
        cin>>x[i][j];
        f=x[i][j];
        sorta[f]++;
    }

}
for(y=0;y<n;y++){
    for(z=0;z<n;z++){
            ind=x[y][z];
            if(ind==0){
            continue;
            }
        for(b=n-1;b>=0;b--){
            for(c=n-1;c>=0;c--){
                if(x[b][c]==0)
            continue;
if(x[b][c]==ind){
    if(c<z){
    izbrisi(x,y,z,n);
    continue;
    }
    if((c==z)&&(b==y)){
        zbir++;
        x[y][z]=0;
        continue;
    }
    if((pravougaonik(x,y,z,b,c))&&((b-y+1)*(c-z+1)==sorta[ind])){
    izbrisi(x,y,z,n);
    zbir+=1;
    continue;

}
else
    izbrisi(x,y,z,n);

}
            }
        }
    }
}

cout<<zbir;

return 0;
}