#include <iostream>
#include <string>
#include <algorithm>

using namespace std;
int db[2000][2000];
bool visited[2000][2000];
int xMov[4]={1, -1, 0, 0};
int yMov[4]={0, 0, -1, 1};
int allw[1000000];
bool forbid[1000000];
int nums=0;
int numslist=0;

void dfs(int x, int y, int db[2000][2000], int n){
    if(visited[x][y]){
        return;
    }
    int wid=0;
    int hig=0;
    bool gow=true;
    bool goh=true;
    for(int i=0;i<n;i++){
        if(db[x][y]==db[x+i][y]&&gow){
            wid++;
            visited[x+i][y]=true;
        }else{
            gow=0;
        }
        if(db[x][y]==db[x][y+i]&&goh){
            hig++;
            visited[x][y+i]=true;
        }else{
            goh=0;
        }
        if(!goh&&!gow){
            break;
        }
    }
    for(int i=0; i<wid; i++){
        for(int m=0;m<hig;m++){
            visited[x+i][y+m]=true;

            if(db[x][y]!=db[x+i][y+m]){
                visited[x+i][y+m]=false;
                return;
            }
        }
    }
    allw[numslist]=db[x][y];
    numslist++;
    nums++;
}

int main()
{
    int n,k;

    cin>>n>>k;
    for(int i=0;i<n;i++){
        for(int m=0;m<n;m++){
            cin>>db[i][m];
        }
    }
    for(int i=0;i<n;i++){
        for(int m=0;m<n;m++){
            if(!visited[i][m]){
                bool breakage=true;
                for(int k=0;k<numslist;k++){
                    if(allw[k]==db[i][m]&&!visited[i][m]){
                        forbid[db[i][m]]=true;
                        allw[k]=0;

                        nums--;
                        breakage=0;
                    }else if(forbid[db[i][m]]&&!visited[i][m]){
                        breakage=0;
                    }
                }
                if(breakage){
                    dfs(i, m, db, n);
                }

            }

        }
    }
    cout<<nums<<endl;


}