#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 510;
const int inf = 0x3f3f3f3f;
int b[N][N];
int a[N][N];//存储某列该行以及之前的和
int main()
{
int n, m, max=-inf;
cin >> n >> m;
int tmp = 0;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cin >> tmp;
b[i][j] = tmp;
a[i][j] = a[i-1][j]+tmp;
}
}
for(int s=0; s<n; s++){//开始行
for(int e=s; e<n; e++){//结束行
tmp = 0;
for(int k=0; k<m; k++){//每一列都加入,总会有最大值,若加和为负,则从下一列开始,tmp从0开始加和
tmp += a[e][k]-a[s][k]+b[s][k];//因为若直接减,会少s行
if(tmp > max){
max = tmp;
}
if(tmp < 0){
tmp = 0;
}
}
}
}
cout << max << endl;
return 0;
}