#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e3+10;
ll w[N][N],p[N][N],dp[N][N];
int fl,fr;
bool vs[N][N];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
void f(int i,int l,int r,int opl,int opr){
if(l>r) return;
int mid=(l+r)/2;
pair<ll,int> pi={LLONG_MIN,0};
for(int j=opl;j<=min(mid,opr);j++){
pair<ll,int> cand={dp[i-1][j]+p[j][mid],-j};
pi=max(pi,cand);
}
dp[i][mid]=pi.first;
int opt=-pi.second;
if(l==r) return;
f(i,l,mid-1,opl,opt);
f(i,mid+1,r,opt,opr);
}
int main(){
int n,m; cin>>n >>m;
vector<string> v;
for(int i=0;i<n;i++){
string s; cin>>s;
v.push_back(s);
}
vector<tuple<ll,ll,ll>> ck;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(vs[i][j] || v[i][j]=='.') continue;
queue<pair<int,int>> q;
ll sum=0;
q.push({i,j}),fl=fr=j;
vs[i][j]=1;
while(!q.empty()){
auto [x,y]=q.front();
q.pop();
fl=min(fl,y),fr=max(fr,y);
sum+=v[x][y]-'0';
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<0 || nx>=n || ny<0 || ny>=m) continue;
if(vs[nx][ny] || v[nx][ny]=='.') continue;
vs[nx][ny]=true;
q.push({nx,ny});
}
}
fl++,fr++;
ck.push_back({fl,fr,sum});
p[0][fl]+=sum,p[0][fr+1]-=sum;
p[fl][fl]-=sum,p[fl][fr+1]+=sum;
}
}
for(int i=0;i<=m;i++){
for(int j=0;j<=m;j++){
if(i-1>=0) p[i][j]+=p[i-1][j];
if(j-1>=0) p[i][j]+=p[i][j-1];
if(i-1>=0 && j-1>=0) p[i][j]-=p[i-1][j-1];
}
}
for(int i=1;i<=m;i++){
f(i,0,m,0,m);
}
for(int i=1;i<=m;i++){
ll cd=LLONG_MIN;
for(int j=0;j<=m;j++) cd=max(cd,dp[i][j]);
cout<<cd <<"\n";
}
}