#include <cassert>   #include <climits>   #include <cstdio>   #include <cstdlib>   #include <cstring>   #include <cmath>   #include <cctype>   #include <vector>   #include <string>   #include <queue>   #include <deque>   #include <stack>   #include <set>   #include <map>   #include <utility>   #include <algorithm>   #include <iostream>   #include <sstream>   #include <numeric>   using namespace std;      #define SIZE(x) int((x).size())   #define REP(i,c) for(auto &i : c)   #define pb push_back   #define eb emplace_back   typedef long long i64;   typedef unsigned long long u64;   const double EPS = 1e-12;   const int INF = 999999999;   typedef vector<int> VI;   typedef vector<string> VS;   typedef pair<int,int> PII;   typedef vector<PII> VPII;      const int MAXN=1500;      int n,m;   int a[MAXN][MAXN];   int f[MAXN][MAXN];      VPII row[MAXN]; // colors in a[i][j .. n]   VPII col[2][MAXN]; // colors in a[i..n][j]       // colors in square (i,j) ... (i+f[i]][j]-1, j+f[i][j-1]), order max(x-i,y-i)   VPII sq[2][MAXN];   int cur;      bool seen[MAXN*MAXN+1];      struct Fenwick {       int n;       VI f;          Fenwick(int n) : n(n)  {           f=VI(n+1,0);       }          inline int LowBit(int x) {           return x&(-x);       }          void Update(int i,int x) {           while(i>0) {               f[i]+=x;               i-=LowBit(i);           }       }          int Get(int i) {           int r=0;           while(i<=n) {               r+=f[i];               i+=LowBit(i);           }           return r;       }   };      void Dbg(const VPII& v) {       REP(p,v) printf( (%d %d)  ,p.first,p.second);printf(  n );   }      void Bf() {       for(int i=0;i<n;i++) {           for(int j=0;j<n;j++) {               int k;               set<int> s;               for(k=1;;k++) {                   if(i+k>n || j+k>n) break;                   for(int x=i;x<i+k;x++)                       for(int y=j;y<j+k;y++) s.insert(a[x][y]);                   if(SIZE(s)>m) break;               }               k--;               if(k!=f[i][j]) printf( Wrong %d %d: %d %d n ,i,j,k,f[i][j]);           }       }   }      void Solve() {       scanf( %d%d ,&n,&m);       for(int i=0;i<n;i++)           for(int j=0;j<n;j++) {               scanf( %d ,&a[i][j]);           }          cur=0;       for(int i=n-1;i>=0;i--) {           int pre=cur;           cur=cur^1;           for(int j=n-1;j>=0;j--) {               row[j]={{0,a[i][j]}};               col[cur][j]={{0,a[i][j]}};               sq[cur][j]={{0,a[i][j]}};               if(i==n-1 || j==n-1) {                   f[i][j]=1;                   continue;               }                  REP(p,row[j+1]) {                   if(p.second==a[i][j]) continue;                   row[j].eb(p.first+1,p.second);                   if(SIZE(row[j])>m) break;               }               // printf( Row %d %d n ,i,j);Dbg(row[j]);                  REP(p,col[pre][j]) {                   if(p.second==a[i][j]) continue;                   col[cur][j].eb(p.first+1,p.second);                   if(SIZE(col[cur][j])>m) break;               }               // printf( Col %d %d n ,i,j);Dbg(col[cur][j]);                  seen[a[i][j]]=1;               VI ps={0,0,0};               vector<const VPII*> vs={&row[j+1],&col[pre][j],&sq[pre][j+1]};               while(SIZE(sq[cur][j])<=m) {                   int md=INF;                   int mi=-1;                   for(int i=0;i<3;i++) {                       const VPII& v=*vs[i];                       if(ps[i]==SIZE(v)) continue;                       if(v[ps[i]].first<md) {                           md=v[ps[i]].first;                           mi=i;                       }                   }                   if(mi<0) break;                   const PII &u=(*vs[mi])[ps[mi]++];                   if(!seen[u.second]) {                       seen[u.second]=1;                       sq[cur][j].eb(u.first+1,u.second);                   }               }               REP(p,sq[cur][j]) seen[p.second]=0;               // printf( Sq %d %d n ,i,j);Dbg(sq[cur][j]);                  f[i][j]=min(n-i,n-j);               if(SIZE(sq[cur][j])>m) f[i][j]=min(f[i][j],sq[cur][j][m].first);               // printf( %d %d: %d n ,i,j,f[i][j]);           }       }          // Bf();          Fenwick ans(n);       for(int i=0;i<n;i++)           for(int j=0;j<n;j++) ans.Update(f[i][j],1);       for(int i=1;i<=n;i++) printf( %d n ,ans.Get(i));      }      int main() {       Solve();          return 0;   }