因为听说比赛不能用int128,所以手写
#include <bits/stdc++.h>
using namespace std;
long long num=1e18;
struct int128{
long long hig,low;
};
int128 jia(int128 a,int128 b){
int128 c;
c.hig=c.low=0;
c.low=a.low+b.low;
c.hig=a.hig+b.hig+c.low/num;
c.low%=num;
return c;
}
int128 jian(int128 a,int128 b){
a.low-=b.low;
if(a.low<0){
a.low+num;
a.hig--;
}
a.hig-=b.hig;
return a;
}
int128 chen(int128 a,int128 b){
int128 c;
c.hig=c.low=0;
c.low=a.low*b.low;
c.hig=((a.hig*b.low+c.low/num)%num+(b.hig*a.low))%num;
c.low%=num;
return c;
}
int128 max128(int128 a,int128 b){
if(a.hig==b.hig)
return (a.low>b.low)?a:b;
return (a.hig>b.hig)?a:b;
}
int mp[81][81];
int tall,weit;
int128 sum,two[81];
void dpo(int x){
int128 dp[82][82];
for(int i=0;i<=weit+1;i++){
for(int j=0;j<=weit;j++){
dp[i][j].hig=dp[i][j].low=0;
}
}
int ci=0;
for(int len=weit-2;len>=0;len--){
ci++;
for(int i=1;i+len<=weit;i++){
int128 a,b;
a.hig=b.hig=0;
a.low=mp[x][i-1];
b.low=mp[x][i+len+1];
a=chen(a,two[ci]);
b=chen(b,two[ci]);
a=jia(a,dp[i-1][i+len]);
b=jia(b,dp[i][i+len+1]);
dp[i][i+len]=max128(a,b);
//cout<<i<<" "<<i+len<<" "<<dp[i][i+len].low<<endl;
}
}
for(int i=1;i<=weit;i++){
int128 a;
a.hig=0;
a.low=mp[x][i];//cout<<a.low<<endl;
a=chen(a,two[weit]);
dp[i][i]=jia(dp[i][i],a);
}
for(int i=2;i<=weit;i++){
dp[i][i]=max128(dp[i][i],dp[i-1][i-1]);
}
sum=jia(sum,dp[weit][weit]);
//cout<<dp[weit][weit].hig<<" "<<dp[weit][weit].low<<endl;
}
int main(){
cin>>tall>>weit;
two[0].hig=two[1].hig=0;
two[0].low=1;
two[1].low=2;
for(int i=2;i<=weit;i++){
two[i]=chen(two[i-1],two[1]);
}
for(int i=1;i<=tall;i++){
for(int j=1;j<=weit;j++){
cin>>mp[i][j];
}
}
for(int i=1;i<=tall;i++){
dpo(i);
}
if(sum.hig>0){
cout<<sum.hig;
}
cout<<sum.low;
return 0;
}