/*
#include <stdio.h>
int arr[101][101]={};
int g=0, t=0,m,n;
int blank[101]={};
void buble()
{
int i,j,temp;
for(i=1; i<t; i++)
{
for(j=1; j<t; j++)
{
if (blank[j] > blank[j+1])
{
temp = blank[j];
blank[j] = blank[j+1];
blank[j+1] = temp;
}
}
}
}
void dfs (int i, int j)
{
if(i>=m || i<0 || j>=n || j<0 || arr[i][j]!=0)return ;
g++;
arr[i][j]=-1;
dfs(i+1,j);
dfs(i,j+1);
dfs(i-1,j);
dfs(i,j-1);
}
int main()
{
int a,i,x1,y1,x2,y2,j,k,w;
scanf("%d %d %d",&m,&n,&a);
for(i=0;i<a;i++)
{
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
for(j=x1; j<x2; j++)
{
for(k=y1; k<y2; k++)
{
arr[k][j]=1;
}
}
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(arr[i][j]==0)
{
dfs(i,j);
t++;
blank[t]=g;
g=0;
}
}
}
buble();
printf("%d\n",t);
for(i=1;i<=t;i++)
{
printf("%d ",blank[i]);
}
}
*/
#include <stdio.h>
int arr[101][101]= {};
int g=0,a;
void dfs (int i, int j,int k)
{
if(i>=a || i<0 || j>=a || j<0 || arr[i][j]<=k)
return ;
arr[i][j]=-1;
dfs(i+1,j,k);
dfs(i,j+1,k);
dfs(i-1,j,k);
dfs(i,j-1,k);
}
int main(void)
{
int gw[101]= {},max=0,maxi=0,min=100;
int i,j;
scanf("%d",&a);
for (i=0; i<a; i++)
{
for (j=0; j<a; j++)
{
scanf("%d",&arr[i][j]);
if(arr[i][j]>max)
{
max=arr[i][j];
}
if(arr[i][j]<min)
{
min=arr[i][j];
}
}
}
for(int k=min; k<=max; k++)
{
g=0;
for(i=0; i<a; i++)
{
for(j=0; j<a; j++)
{
if(arr[i][j]>k)
{
dfs(i,j,k);
g++;
}
}
}
gw[k]=g;
printf("%d ",g);
}
/*
for(i=0; i<; i++)
{
if(max<gw[i])
{
maxi=i;
max=gw[i];
}
}
printf("%d",maxi);
*/
}