#include <bits/stdc++.h>
using namespace std;
int n,a[702][702],cnt[1836],st[6767],L[2][500005];
vector <pair<int,int>> ve[500005];
void UPDATE(int id, int l, int r, int i, int v)
{
    if (l>i || r<i) return;
    else if (l==r)
    {
        st[id]=v;
        return;
    }
    int mid=(l+r)/2;
    if (i<=mid) UPDATE(id*2,l,mid,i,v);
    else UPDATE(id*2+1,mid+1,r,i,v);
    st[id]=max(st[id*2],st[id*2+1]);
}
int GET(int id, int l, int r, int u, int v)
{
    if (l>v || r<u) return -1e18;
    else if (l>=u && r<=v) return st[id];
    int mid=(l+r)/2;
    return max(GET(id*2,l,mid,u,v),GET(id*2+1,mid+1,r,u,v));
}
void SOLVE(int x)
{
    for (int i=0;i<ve[x].size();i++)
    {
        int j=ve[x][i].second,mx=GET(1,1,n,1,j)+1;
        if (GET(1,1,n,j,j)<mx) UPDATE(1,1,n,j,mx),L[0][i]=mx;
    }
    for (int i=0;i<ve[x].size();i++) UPDATE(1,1,n,ve[x][i].second,0);
    for (int i=ve[x].size()-1;i>=0;i--)
    {
        int j=ve[x][i].second,mx=GET(1,1,n,j,n)+1;
        if (GET(1,1,n,j,j)<mx) UPDATE(1,1,n,j,mx),L[1][i]=mx;
    }
    for (int i=0;i<ve[x].size();i++) UPDATE(1,1,n,ve[x][i].second,0);
    for (int i=0;i<ve[x].size();i++) cnt[L[0][i]+L[1][i]-1]++,L[0][i]=L[1][i]=0;
}
signed main()
{
    ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>n;
    for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) cin>>a[i][j];
    for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) ve[a[i][j]].push_back({i,j});
    for (int i=1;i<=n*n;i++) if (ve[i].size()) SOLVE(i);
    for (int i=1;i<2*n;i++) cout<<cnt[i]<<'\n';
    return 0;
}