#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1010;
int a[N][N];
bool t[N][N];
int n,m;
int dx[]={0,1,0,-1};
int dy[]={-1,0,1,0};
vector<int>x;
int dfs(int x,int y)
{
	int sum=1;
	t[x][y]= true;
	for(int k=0;k<4;k++)
	{
		int i=x+dx[k],j=y+dy[k];
	    if(!t[i][j]&&(a[x][y]>>k&1)!=1&&i>0&&i<=n&&j>0&&j<=m)sum+=dfs(i,j)//,t[x][y]=true;
	}
	return sum;
}
int main()
{
	
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
		if(!t[i][j])
			x.push_back(dfs(i,j));
                        //t[i][j]=true;
		}
	}
	sort(x.begin(),x.end());
	reverse(x.begin(),x.end());
	for(int i=0;i<x.size();i++)
	{
		cout<<x[i]<<" ";
	}
	return 0;
}
注意一下在递归前标记所走过的路径和&的优先级小于!=