#include <bits/stdc++.h>
using namespace std;
const long long inf = 2e18;
const long long mod = 1e9 + 7;
const double Pi = acos(-1);
int n, m, k;
int a[59][20009], sum[59][20009], dp[59][20009];
int tree[100009], lzy[100009];
int in(int i, int j) {
  return sum[i][j + k - 1] - sum[i][j - 1] + sum[i + 1][j + k - 1] -
         sum[i + 1][j - 1];
}
void clear(int node, int l, int r) {
  tree[node] = lzy[node] = 0;
  if (l == r) return;
  clear(node * 2, l, (l + r) / 2);
  clear(node * 2 + 1, (l + r) / 2 + 1, r);
}
void lzyUpd(int node, int l, int r) {
  tree[node] += lzy[node];
  if (l != r) {
    lzy[node * 2] += lzy[node];
    lzy[node * 2 + 1] += lzy[node];
  }
  lzy[node] = 0;
}
void upd(int node, int l, int r, int s, int e, int x) {
  lzyUpd(node, l, r);
  if (s > r || e < l) return;
  if (s <= l && e >= r) {
    lzy[node] += x;
    lzyUpd(node, l, r);
    return;
  }
  upd(node * 2, l, (l + r) / 2, s, e, x);
  upd(node * 2 + 1, (l + r) / 2 + 1, r, s, e, x);
  tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}
int query(int node, int l, int r, int s, int e) {
  lzyUpd(node, l, r);
  if (s > r || e < l) return 0;
  if (s <= l && e >= r) return tree[node];
  return max(query(node * 2, l, (l + r) / 2, s, e),
             query(node * 2 + 1, (l + r) / 2 + 1, r, s, e));
}
int main() {
  cin >> n >> m >> k;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      cin >> a[i][j];
      sum[i][j] = a[i][j] + sum[i][j - 1];
    }
  }
  for (int i = 1; i <= n; i++) {
    int crnt = 0;
    for (int j = k; j >= 1; j--) {
      crnt += a[i][j];
      upd(1, 0, m - k + 1, j, j, -crnt);
    }
    dp[i][1] = max(dp[i][1], query(1, 0, m - k + 1, 1, m - k + 1) + in(i, 1));
    for (int j = 2; j <= m - k + 1; j++) {
      int L = j, R = min(m - k + 1, j + k - 1);
      upd(1, 0, m - k + 1, L, R, -a[i][j + k - 1]);
      L = max(1, j - k), R = j - 1;
      upd(1, 0, m - k + 1, L, R, a[i][j - 1]);
      dp[i][j] = max(dp[i][j], query(1, 0, m - k + 1, 1, m - k + 1) + in(i, j));
    }
    clear(1, 0, m - k + 1);
    for (int j = 1; j <= m - k + 1; j++) {
      upd(1, 0, m - k + 1, j, j, dp[i][j]);
    }
  }
  int ans = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m - k + 1; j++) {
      ans = max(ans, dp[i][j]);
    }
  }
  cout << ans << endl;
}
