#include <bits/stdc++.h>
using namespace std;

const long long INF = 4e18;
const int MAXM = 2005;

// Khai báo biến toàn cục (cấp phát bộ nhớ tĩnh 1 lần duy nhất)
long long dp_max[MAXM];
long long dp_min[MAXM];
long long cur_max[MAXM];
long long cur_min[MAXM];

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n, m;
    cin >> n >> m;

    // Khởi tạo trạng thái ban đầu cho hàng 0 / trước hàng 1
    fill(dp_max + 1, dp_max + m + 1, -INF);
    fill(dp_min + 1, dp_min + m + 1, INF);

    for (int i = 1; i <= n; ++i) {
        // Tái sử dụng mảng toàn cục bằng cách reset giá trị ban đầu cho hàng i
        fill(cur_max + 1, cur_max + m + 1, -INF);
        fill(cur_min + 1, cur_min + m + 1, INF);

        for (int j = 1; j <= m; ++j) {
            long long val;
            cin >> val;

            if (i == 1 && j == 1) {
                cur_max[1] = val;
                cur_min[1] = val;
                continue;
            }

            // Hướng di chuyển XUỐNG DƯỚI (từ ô (i-1, j))
            if (i > 1) {
                cur_max[j] = max(cur_max[j], dp_max[j] + val);
                cur_min[j] = min(cur_min[j], dp_min[j] + val);
            }

            // Hướng di chuyển SANG PHẢI (từ ô (i, j-1))
            if (j > 1) {
                cur_max[j] = max(cur_max[j], -cur_min[j - 1] + val);
                cur_min[j] = min(cur_min[j], -cur_max[j - 1] + val);
            }
        }

        // Rolling: Copy kết quả hàng hiện tại (cur) sang hàng cũ (dp) để chuẩn bị cho hàng tiếp theo
        for (int j = 1; j <= m; ++j) {
            dp_max[j] = cur_max[j];
            dp_min[j] = cur_min[j];
        }
    }

    cout << dp_max[m] << "\n";

    return 0;
}