#include<iostream>
#include<vector>

using namespace std;

struct polje{
	int x,y;
};

bool proveri(vector<polje> polja)
{
	if(polja.empty()) return false;
	if(polja.size() == 1) return true;
	
	polje gore_levo = polja[0];
	polje dole_desno = polja[polja.size() - 1];
	
	int zahtevani_br_el = (dole_desno.x - gore_levo.x + 1) * (dole_desno.y - gore_levo.y + 1);
	if(polja.size() != zahtevani_br_el) return false;
	
	for(int i = 1;i < polja.size() - 1; ++i)
	{
		if(polja[i].x < gore_levo.x || polja[i].x > dole_desno.x || polja[i].y < gore_levo.y || polja[i].y > dole_desno.y)
		return false;
	}
	return true;
}

int main()
{
	int n,k;
	cin >> n >> k;
	vector<polje> polja[k];
	int m[n][n];
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			cin >> m[i][j];
			polje p = {i,j};
			polja[m[i][j] - 1].push_back(p); 
		}	
	}
	
	int broj_pravougaonika = 0;
	for(int i = 0; i < k; ++i)
	{
		if(proveri(polja[i]))
		{
			broj_pravougaonika++;
		}	
	}
	
	cout<<broj_pravougaonika << endl;
	
	return 0;
	
}