#include<bits/stdc++.h>
using namespace std;
const int N=100;
struct big{
int len,a[2000];
void write(){
for(int i=len;i;i--)printf("%d",a[i]);
printf(" ");
}
void fix(){
for(int i=1;i<len;i++){
a[i+1]+=a[i]/10;
a[i]%=10;
}
while(a[len]>9){
a[len+1]+=a[len]/10;
a[len++]%=10;
}
}
void fz(int b){
len=0;
memset(a,0,sizeof(a));
while(b){
len++;
a[len]=b%10;
b/=10;
}
if(len==0)len=1;
}
}dp[N][N],ans,coef,maxinum;
big operator * (const big &a,const int &b){
big c;
c.len=a.len;
for(int i=1;i<=c.len;i++)c.a[i]=a.a[i]*b;
c.fix();
return c;
}
big operator + (const big &a,const big &b){
big c;
c.len=max(a.len,b.len);
for(int i=1;i<=c.len;i++)c.a[i]=a.a[i]+b.a[i];
c.fix();
return c;
}
big Max(const big &a,const big &b){
if(a.len>b.len)return a;
if(a.len<b.len)return b;
for(int i=a.len;i;i--){
if(a.a[i]>b.a[i])return a;
if(a.a[i]<b.a[i])return b;
}
return a;
}
int n,m,a[N];
int main(){
scanf("%d%d",&n,&m);
while(n){
n--;
for(int i=1;i<=m;i++)scanf("%d",a+i);
for(int i=0;i<=m;i++){
for(int j=1;j<=m+1;j++){
dp[i][j].fz(0);
}
}
coef.fz(1);
for(int len=m-1;len;len--){
coef=coef*2;
for(int i=1,j=i+len-1;j<=m;i++,j++){
dp[i][j]=Max(dp[i-1][j]+coef*a[i-1],dp[i][j]);
if(i==3&&j==3)dp[i][j].write();
dp[i][j]=Max(dp[i][j+1]+coef*a[j+1],dp[i][j]);
}
}
maxinum.len=-114514;
for(int i=1;i<=n;i++)maxinum=Max(maxinum,dp[i][i]+coef*2*a[i]);
ans=ans+maxinum;
}
ans.write();
return 0;
}