#include<bits/stdc++.h>
using namespace std;
const int M=100;
int n,m,b[M],c[M],ans[M],a[M][M];
int ord[M][M],sum[M][M],rec[M][M][M],dp[M][M][M][M];
bool check(int u,int l,int r){
int i;
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(i=1;i<=dp[u][l+1][r][0];i++)
b[i]=dp[u][l+1][r][i]*2;
b[0]=dp[u][l+1][r][0];
for(i=1;i<=dp[u][l][r-1][0];i++)
c[i]=dp[u][l][r-1][i]*2;
c[0]=dp[u][l][r-1][0];
for(i=1;i<=b[0];i++){
b[i+1]+=b[i]/10;
b[i]%=10;
}
for(i=1;i<=c[0];i++){
c[i+1]+=c[i]/10;
c[i]%=10;
}
while(b[b[0]+1]){
b[0]++;
b[b[0]+1]=b[b[0]]/10;
b[b[0]]%=10;
}
while(c[c[0]+1]){
c[0]++;
c[c[0]+1]=c[c[0]]/10;
c[c[0]]%=10;
}
b[1]+=a[u][l];
c[1]+=a[u][r];
for(i=1;i<=b[0];i++){
b[i+1]+=b[i]/10;
b[i]%=10;
}
for(i=1;i<=c[0];i++){
c[i+1]+=c[i]/10;
c[i]%=10;
}
while(b[b[0]+1]){
b[0]++;
b[b[0]+1]=b[b[0]]/10;
b[b[0]]%=10;
}
while(c[c[0]+1]){
c[0]++;
c[c[0]+1]=c[c[0]]/10;
c[c[0]]%=10;
}
if(b[0]!=c[0])return b[0]>c[0];
for(i=b[0];i>0;i--)
if(b[i]!=c[i])
return b[i]>c[i];
return 0;
}
void search(int u,int l,int r){
if(l>r)return;
if(rec[u][l][r]==0){
ord[u][m-r+l]=a[u][l];
search(u,l+1,r);
}
else{
ord[u][m-r+l]=a[u][r];
search(u,l,r-1);
}
}
void mul_self(){
int i;
for(i=1;i<=b[0];i++)
b[i]*=2;
for(i=1;i<=b[0];i++){
b[i+1]+=b[i]/10;
b[i]%=10;
}
while(b[b[0]+1]){
b[0]++;
b[b[0]+1]=b[b[0]]/10;
b[b[0]]%=10;
}
}
void cf(int x,int y){
int i;
memset(c,0,sizeof(c));
for(i=0;i<=b[0];i++)
c[i]=b[i];
for(i=1;i<=c[0];i++)
c[i]*=ord[x][y];
for(i=1;i<=c[0];i++){
c[i+1]+=c[i]/10;
c[i]%=10;
}
while(c[c[0]+1]){
c[0]++;
c[c[0]+1]=c[c[0]]/10;
c[c[0]]%=10;
}
sum[x][0]=max(c[0],sum[x][0]);
for(i=1;i<=sum[x][0];i++)
sum[x][i]+=c[i];
for(i=1;i<=sum[x][0];i++){
sum[x][i+1]+=sum[x][i]/10;
sum[x][i]%=10;
}
while(sum[x][sum[x][0]+1]){
sum[x][0]++;
sum[x][sum[x][0]+1]=sum[x][sum[x][0]]/10;
sum[x][sum[x][0]]%=10;
}
}
void add(int x){
int i;
ans[0]=max(ans[0],sum[x][0]);
for(i=1;i<=ans[0];i++)
ans[i]+=sum[x][i];
for(i=1;i<=ans[0];i++){
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
while(ans[ans[0]+1]){
ans[0]++;
ans[ans[0]+1]=ans[ans[0]]/10;
ans[ans[0]]%=10;
}
}
int main(){
int i,j,l,r;
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>a[i][j];
for(i=1;i<=n;i++)
for(l=m;l>0;l--)
for(r=l;r<=m;r++)
if(check(i,l,r)){
rec[i][l][r]=0;
for(j=0;j<=b[0];j++)
dp[i][l][r][j]=b[j];
}
else{
rec[i][l][r]=1;
for(j=0;j<=c[0];j++)
dp[i][l][r][j]=c[j];
}
for(i=1;i<=n;i++)
search(i,1,m);
memset(b,0,sizeof(b));
b[0]=b[1]=1;
for(i=1;i<=m;i++){
mul_self();
for(j=1;j<=n;j++)
cf(j,i);
}
for(i=1;i<=n;i++)
add(i);
for(i=ans[0];i>0;i--)
cout<<ans[i];
return 0;
}