#include <bits/stdc++.h>

#define MAXN 2010
#define MAXK 1000100
using namespace std;

int M[MAXN][MAXN];
int step[MAXN],res[MAXK];
int k,n,rez;

void citaj(){
    int i,j;
    scanf("%d%d",&n,&k);
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            scanf("%d",&M[i][j]);

}

void postavi0(int i1, int j1, int i2, int j2){
     int i,j;
    res[M[i1][j1]]++;
    for(i=i1;i<i2;i++){
        for(j=j1;j<j2;j++){
            M[i][j]=0;

        }
    }


}
int brojk(int k,int i, int j){
    int res=0;
    while(true)
    {
        if(M[i][j]!=k)
            break;
        j++;
        res++;
    }
    return res;
}
void radi(){
    int i,j,i1,j1,j2,l,d;
    int gran;
    int temp=0;
    for(j=0;j<n;j++){
        if(step[j]==n){
            temp=j+1;
            continue;
        }
        i=step[j];

        d=brojk(M[i][j],i,j);
        l=0;
        for(i1=i;i1<n;i1++){
            if(brojk(M[i][j],i1,j)<d)
                break;
            l++;
        }
        d+=j;
        postavi0(i,j,i+l,d);
        for(j2=j;j2<d;j2++){
            step[j2]=i1;
        }
        gran=i1;
        if(step[j]==n){
            temp=j+1;
            continue;
        }
        for(j1=j+1;j1<n;j1++){
            for(i=step[j1];i<gran;i++){
                d=brojk(M[i][j1],i,j1);
                l=0;
                for(i1=i;i1<n;i1++){
                    if(brojk(M[i][j1],i1,j1)<d)
                        break;
                    l++;
                }
                d+=j1;
                postavi0(i,j1,i+l,d);
                for(j2=j1;j2<d;j2++){
                    step[j2]=i1;
                }
                i=i1-1;
                if(i1>gran){
                    gran=i1;
                    j1=j2-1;
                }
            }
        }
        j=temp-1;
    }
}
void resi(){
    int i;
    for(i=1;i<=k;i++){
        if(res[i]==1)
            rez++;
    }
    cout << rez;
}
int main()
{
    citaj();
    radi();
    resi();
}