#include <bits/stdc++.h>
#define up(i, a, b) for (int i = a, _b = b; i <= _b; i++)
#define down(i, a, b) for (int i = a, _b = b; i >= _b; i--)
#define long long long
#define endl '\n'
#define X first
#define Y second
#define II pair<int, int>
#define debug(X) cerr << #X << " = " << X << endl
#define debug2(X, Y) cerr << #X << " = " << X << " , " << #Y << " = " << Y << endl
#define show(X, a, b) { cerr << #X << " = "; up(_, a, b) cerr << X[_] << " "; cerr << endl; }
#define gc getchar
#define pc putchar
using namespace std;
inline void read(int &x) {
        register int c = gc();
        x = 0;
        int neg = 0;
        for (; ((c<48 || c>57) && c != '-'); c = gc());
        if(c=='-') {neg=1; c=gc();}
        for(; c>47 && c<58; c = gc()) {x = (x<<1) + (x<<3) + c - 48;}
        if(neg) x=-x;
}
inline void writeln(int x) {

        char buffor[21];
        register int i=0;
        int neg=0; if (x<0) {neg=1; x= -x;}
        do {
                buffor[i++]=(x%10)+'0';
                x/=10;
        } while(x);
        i--;
        if (neg) pc('-');
        while(i>=0) pc(buffor[i--]);
        pc('\n');
}
const int N = 1010;
int m, n, a[N][N], f[N][N];
void input() {
        cin >> n >> m;
        up(i, 1, m)
          up(j, 1, n)
            cin >> a[i][j];
}
int query(int x, int y, int u, int v) {
        return a[u][v] - a[x - 1][v] - a[u][y - 1] + a[x -1][y - 1];
}

void solve() {
        up(i, 1, m)
          up(j, 1, n)
            a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];

        f[m][n] = 0;
        down(i, m, 0)
         down(j, n, 0) {
            if (i == m && j == n) continue;
            if ((i + j) % 2 == 0) {
                f[i][j] = -1e9; //try to maximize;
                if (i + 1 <= m) f[i][j] = max(f[i][j], f[i + 1][j] + query(i + 1, j + 1, i + 1, n));
                if (j + 1 <= n) f[i][j] = max(f[i][j], f[i][j + 1] - query(i + 1, j + 1, m, j + 1));
            }
            if ((i + j) % 2 == 1) {
                f[i][j] = 1e9; //try to minimize;
                if (i + 1 <= m) f[i][j] = min(f[i][j], f[i + 1][j] + query(i + 1, j + 1, i + 1, n));
                if (j + 1 <= n) f[i][j] = min(f[i][j], f[i][j + 1] - query(i + 1, j + 1, m, j + 1));
            }
         }

        cout << abs(f[0][0]) << endl;
}
int main() {
        ios_base::sync_with_stdio(false);
        cin.tie(NULL);

  #ifdef I_Love_Pork
  #define TASK "tmp"
        freopen(TASK ".inp","r",stdin);
        freopen(TASK ".out","w",stdout);
  #endif


        input();
        solve();



        return 0;
}

