主要是想巩固一下高精度
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1010;
const int bit=1e6;
const int M=101;
int read(){
char ch=getchar();int k=0,f=1;;
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){k=(k<<1)+(k<<3)+ch-'0';ch=getchar();}
return f*k;
}
//注意运算符重载的使用
struct Bigint{
int len,a[N];
inline Bigint operator *(const int &x){
Bigint t=(*this);
int len=t.len;
for(int i=1;i<=len;i++)t.a[i]*=x;
for(int i=1;i<=len;i++){
t.a[i+1]+=t.a[i]/bit;t.a[i]%=bit;
}
if(t.a[len+1]>0)t.len++;
return t;
}
inline Bigint operator +(const Bigint &x){
Bigint t=(*this);
int tl=max(t.len,x.len);
for(int i=1;i<=tl;i++){
t.a[i]+=x.a[i];
t.a[i+1]+=t.a[i]/bit;
t.a[i]%=bit;
}
if(t.a[tl+1]>0)tl++;t.len=tl;
return t;
}
inline Bigint operator =(const int &x){
len=1;a[1]=x;return *this;
}
inline void write(){
Bigint t=(*this);
for(int i=t.len;i>0;i--){
int tmp=bit;
while(i<len&&tmp>10*t.a[i]){tmp/=10;putchar(48);}//补位0
printf("%d",t.a[i]);
}
}
}f[M][M],p[M],res;
int n,m,b[M];
inline void checkmax(Bigint &a,Bigint b){
if(a.len<b.len){a=b;return;}
else if(a.len!=b.len)return;
for(int i=a.len;i>0;i--){
if(a.a[i]<b.a[i]){a=b;return;}
else if(a.a[i]!=b.a[i])return;
}
}
inline void dp(){
for(int i=1;i<=m;i++)
for(int j=m;j>=i;j--){
f[i][j].len=0;
Bigint t1=f[i-1][j]+p[m-j+i-1]*b[i-1],t2=f[i][j+1]+p[m-j+i-1]*b[j+1];
checkmax(t2,t1);
checkmax(f[i][j],t2);
}
Bigint ans;ans=-1;
for(int i=1;i<=m;i++){
Bigint t=f[i][i]+p[m]*b[i];
checkmax(ans,t);
}
res=res+ans;
return;
}
int main(){
p[0]=1;
for(int i=1;i<=90;i++)p[i]=p[i-1]*2;
n=read();m=read();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
b[j]=read();
dp();
}
res.write();
return 0;
}