#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INF=1e18;
int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
int n,m;
char a[2001][2001];
bool used[2001][2001];
int cs[2001*2001];
int cc[2001][2001];
int ss[2001];
int co=0;
set<int>all[2001];
bool go(int x,int y){
if(min(x,y)>=1&&x<=n&&y<=m&&a[x][y]!='.'&&!used[x][y]) return 1;
return 0;
}
void dfs(int x,int y){
cc[x][y]=co;
cs[cc[x][y]]+=(a[x][y]-'0');
used[x][y]=1;
for(int i=0;i<4;i++){
int X=x+dx[i];
int Y=y+dy[i];
if(go(X,Y)) dfs(X,Y);
}
}
int dp[2001][2001];//dp[i][j]=i ye j.ni qoyuram
int cost(int i,int j){
int s=ss[j];
int same=0;
for(int ccc:all[i]){
if(all[j].count(ccc)>0) same+=cs[ccc];
}
return same;
}
void f(int c,int l,int r,int optl,int optr){
if(l>r) return;
int mid=(l+r)>>1;
pair<int,int>best={-INF,-1};
for(int i=optl;i<=min(mid,optr);i++) best=max(best,{dp[c-1][i]-cost(i,mid)+ss[mid],i});
dp[c][mid]=best.first;
int nwopt=best.second;
f(c,l,mid-1,optl,nwopt);
f(c,mid+1,r,nwopt,optr);
}
void solve(){
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(!used[i][j]&&a[i][j]!='.') co++,dfs(i,j);
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
all[i].insert(cc[j][i]);
}
for(int ccc:all[i]) ss[i]+=cs[ccc];
}
for(int i=1;i<=m;i++) dp[1][i]=ss[i];
for(int c=2;c<=m;c++){
f(c,1,m,1,m);
}
for(int i=1;i<=m;i++){
int res=0;
for(int j=1;j<=m;j++) res=max(res,dp[i][j]);
cout<<res<<endl;
}
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int T=1;//cin>>T;
while(T--) solve();
}