#include <bits/stdc++.h>
using namespace std;
#define int long long
#define NM 1002
int N,x[NM*NM],g[NM*NM][4],s[NM*NM],v[NM*NM],w[NM*NM],p[NM*NM],t[NM*NM],r[NM*NM],ti[NM*NM],to[NM*NM],ta;
void dfs(int i){
s[i]=1;
w[i]=i;
ti[i]=ta++;
for(int j:g[i]){
if(x[j]!=x[i]){
continue;
}
if(j==p[i]){
continue;
}
if(v[j]){
if(v[j]<v[w[i]]){
w[i]=j;
}
continue;
}
v[j]=v[i]+1;
p[j]=i;
t[j]=t[i];
dfs(j);
s[i]+=s[j];
if(v[w[j]]<v[w[i]]){
w[i]=w[j];
}
}
to[i]=ta++;
}
int des(int i,int j){
return ti[i]<=ti[j]&&to[i]>=to[j];
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin>>N;
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
cin>>x[i*NM+j];
}
}
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
g[i*NM+j][0]=i*NM+j-1;
g[i*NM+j][1]=i*NM+j+1;
g[i*NM+j][2]=(i-1)*NM+j;
g[i*NM+j][3]=(i+1)*NM+j;
}
}
int o=0;
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
int y=i*NM+j;
if(v[y]){
continue;
}
o++;
v[y]=1;
t[y]=o;
r[o]=y;
dfs(y);
}
}
for(int d=0;d<2;d++){
for(int i=1;i+(d==1)<=N;i++){
for(int j=1;j+(d==0)<=N;j++){
int y1=i*NM+j;
int y2=(i+(d==1))*NM+j+(d==0);
if(t[y1]==t[y2]){
cout<<0<<' ';
continue;
}
int c[2]{1,1};
for(int i=0;i<2;i++){
int b=0;
set<int>bb;
for(int z:g[y2]){
if(z==y1){
continue;
}
if(x[z]!=x[y1]){
continue;
}
if(t[z]==t[y1]&&w[y1]==y1){
if(!des(y1,z)){
if(!b){
b=1;
c[i]+=s[r[t[z]]]-s[y1];
}
continue;
}
int k=-1;
for(int kk:g[y1]){
if(des(y1,kk)&&des(kk,z)){
if(k!=-1){
cout<<(y1/NM)<<' '<<(y1%NM)<<endl;
cout<<(y2/NM)<<' '<<(y2%NM)<<endl;
cout<<(z/NM)<<' '<<(z%NM)<<endl;
cout<<"old "<<(k/NM)<<' '<<(k%NM)<<endl;
cout<<"new "<<(kk/NM)<<' '<<(kk%NM)<<endl;
exit(1);
}
k=kk;
}
}
if(k==-1){
exit(1);
}
if(bb.insert(k).second){
c[i]+=s[k];
}
}
else{
c[i]+=s[r[t[z]]];
for(int zz:g[y2]){
if(zz<z&&z!=y1&&t[zz]==t[z]){
c[i]-=s[r[t[z]]];
break;
}
}
}
}
swap(y1,y2);
}
cout<<c[0]*c[1]<<' ';
}
cout<<'\n';
}
}
return 0;
}