#include<iostream>
#include<vector>

#define MAX_N 2000

using namespace std;

struct Pos{
    int x;
    int y;
    Pos(int t_x, int t_y){
        x = t_x;
        y = t_y;
    }
};

void ulaz(vector< vector<Pos> > &p, int a[][MAX_N], int &n, int &k);
void debug(vector< vector<Pos> > p, int n, int k);
bool isRect(vector< vector<Pos> > p, int a[][MAX_N], int n, int k);

int main(){
    int n;
    int k;
    int valid = 0;
    int a[MAX_N][MAX_N];
    vector< vector<Pos> > p;
    ulaz(p, a, n, k);
    for(int i=0;i<k;i++){
        if(p.at(i).size() > 0){
            valid += isRect(p, a, n, i);
        }
    }
    cout << valid << endl;
    return 0;
}

void ulaz(vector< vector<Pos> > &p, int a[][MAX_N], int &n, int &k){
    cin >> n;
    cin >> k;
    int tmp;
    p.resize(k);
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin >> tmp;
            p.at(tmp-1).push_back(Pos(j, i));
            a[i][j] = tmp;
        }
    }
}

bool isRect(vector< vector<Pos> > p, int a[][MAX_N], int n, int k){
    Pos UL = p.at(k).at(0);
    Pos LR = p.at(k).at(p.at(k).size()-1);
    int h = LR.y - UL.y + 1;
    int w = LR.x - UL.x + 1;
    if(h*w != p.at(k).size()){
        return 0;
    }
    else{
        for(int i=0;i<h;i++){
            for(int j=0;j<w;j++){
                if(a[UL.y+i][UL.x+j] != k+1){
                    return 0;
                }
            }
        }
        return 1;
    }
}