#include <bits/stdc++.h>

using namespace std;
int a[1001][1001];
map<int,pair<int,int> > m;
set<int> moze,nm;
int main(int argc, char** argv) {
	int n,k;
	scanf("%d %d",&n,&k);
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)scanf("%d",&a[i][j]);
	int trb,xk=0,xp=0;
	for(int i=0;i<n;i++)
	{
		trb=a[i][0];
		xp=0;
		xk=-1;
		for(int j=0;j<n;j++)
		{
			//cout<<"stigoh do"<<a[i][j]<<endl;
			if(moze.count(a[i][j]))
			{
				if(j<m[a[i][j]].first||j>m[a[i][j]].second||a[i-1][j]!=a[i][j])
				{
					//cout<<"Izb "<<a[i][j]<<endl;
					moze.erase(a[i][j]);
					nm.insert(a[i][j]);
				}
			}
			if((a[i][j]!=trb||j==n-1))
			{
				xk=j;
				pair<int,int> p;
				p.first=xp;
				p.second=xk;
				m[trb]=p;
				if(!nm.count(trb))
				{
					moze.insert(trb);
					//cout<<"ub "<<trb<<endl;
				}
				trb=a[i][j];
				xp=j;	
				if(j==n-1&&!nm.count(trb)&&!moze.count(trb))
				{
					pair<int,int> p;
					p.first=xp;
					p.second=xk;
					m[trb]=p;
					moze.insert(trb);
					//cout<<"ub "<<trb<<endl;
				}			
			}
			else xk++;
			if(a[i-1][j]==a[i][j-1]&&a[i-1][j]!=a[i][j])
			{
				moze.erase(a[i-1][j]);
				nm.insert(a[i-1][j]);
			}
		}
	}
	printf("%d",moze.size());
	return 0;
}
/*
5 10
3 2 2 1 4
3 2 2 7 4
8 2 2 1 3
8 8 9 9 9
8 8 1 5 1
*/