#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int M[2020][2020];
bool zak[2020][2020];

vector <int>pravougaonici;
vector <int>res;
vector <int>rodovi;


struct red{
    int ii;
    int pocJ;
    int krJ;
    int rod;

    bool operator > (const red& str) const
    {
        return (rod > str.rod);
    }
};
vector<red>proba;

bool moze(int i,int j,int n)
{
    return i<n&&j<n;
}

bool postoji(int x)
{
    for(int q=0;q<rodovi.size();q++)
        if(rodovi.at(q)==x)return true;
    return false;
}

void obidji(int i,int j,int n)
{
    if(moze(i+1,j,n)&&!zak[i+1][j]&&M[i][j]==M[i+1][j])
    {
        obidji(i+1,j,n);
        zak[i+1][j]=true;
    }

    if(moze(i,j+1,n)&&!zak[i][j+1]&&M[i][j]==M[i][j+1])
    {
        obidji(i,j+1,n);
        zak[i][j+1]=true;
    }
}

int obidjiKolone(int i,int j,int n)
{
 //   if(moze(i,j+1,n)&&!zak[i][j+1]&&M[i][j]==M[i][j+1])
  //  {
   //     obidji(i,j+1,n);
   //     zak[i][j+1]=true;
  //  }
   // return j;
  //   if(moze(i+1,j,n)&&!zak[i+1][j]&&M[i][j]==M[i+1][j])
  // {
   //    obidji(i+1,j,n);
  //      zak[i+1][j]=true;
   // }
  //  return i;
  for(int k=i;k<n;k++)
  {
      if(moze(k+1,j,n)&&!zak[k+1][j]&&M[k][j]==M[k+1][j])zak[k+1][j]=true;
      else return k;
  }
}


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

    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
           if(!zak[j][i])
           {
            // obidji(i,j,n);
             //pravougaonici.push_back(M[i][j]);
             red r;
             r.ii=i;
             r.pocJ=j;
             r.krJ=obidjiKolone(j,i,n);
             r.rod=M[j][i];
             proba.push_back(r);
           }
        }
    }
    //    for(int i=0;i<n;i++)
       //  cout<<M[i][0]<<endl;
       sort(proba.begin(),proba.end(),greater<red>());

  //   for(int i=0;i<proba.size();i++)
    //       cout<<proba.at(i).rod<<" "<<proba.at(i).ii<<" "<<proba.at(i).pocJ<<" "<<proba.at(i).krJ<<endl;

        for(int i=0;i<proba.size();i++)
        {
            red A=proba.at(i);
            bool izbaciA=false;
            int rodZaIzb=0;
            int j;
            for(j=i;j<proba.size();j++)
            {
                red B=proba.at(j);
                if(A.rod!=B.rod)break;
                if(abs(A.ii-B.ii)>j-i||A.pocJ!=B.pocJ||A.krJ!=B.krJ){izbaciA=true;rodovi.push_back(A.rod);}
            }
        }

        for(int i=0;i<proba.size();i++)
        {
            if(!postoji(proba.at(i).rod)){
                    res.push_back(proba.at(i).rod);
                    rodovi.push_back(proba.at(i).rod);
            }
        }


        cout <<res.size()<<" ";


    return 0;
}