#include <bits/stdc++.h>
using namespace std;
const int MAXN = 20202;
int n, m, k, addv[MAXN * 4], maxv[MAXN * 4], a[52][MAXN], dp[MAXN],
    pref[52][MAXN];
void pushup(int o) { maxv[o] = max(maxv[(o << 1)], maxv[(o << 1 | 1)]); }
void pushdown(int o) {
  if (!addv[o]) return;
  addv[(o << 1)] += addv[o];
  addv[(o << 1 | 1)] += addv[o];
  maxv[(o << 1)] += addv[o];
  maxv[(o << 1 | 1)] += addv[o];
  addv[o] = 0;
}
void build(int o, int l, int r, int *arr) {
  addv[o] = 0;
  if (l == r) {
    maxv[o] = arr[l];
    return;
  }
  build((o << 1), l, ((l + r) >> 1), arr);
  build((o << 1 | 1), ((l + r) >> 1) + 1, r, arr);
  pushup(o);
}
void uadd(int o, int l, int r, int ql, int qr, int v) {
  if (ql <= l && r <= qr) {
    addv[o] += v;
    maxv[o] += v;
    return;
  }
  pushdown(o);
  if (ql <= ((l + r) >> 1)) uadd((o << 1), l, ((l + r) >> 1), ql, qr, v);
  if (qr > ((l + r) >> 1)) uadd((o << 1 | 1), ((l + r) >> 1) + 1, r, ql, qr, v);
  pushup(o);
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      scanf("%d", &a[i][j]);
      pref[i][j] = pref[i][j - 1] + a[i][j];
    }
  }
  for (int i = 1; i <= n; ++i) {
    if (i != 1)
      for (int j = 1; j <= m - k + 1; ++j) {
        dp[j] += pref[i][j + k - 1] - pref[i][j - 1];
      }
    build(1, 1, m - k + 1, dp);
    if (i != 1)
      for (int j = 1; j <= k; ++j)
        uadd(1, 1, m - k + 1, max(1, j - k + 1), j, -a[i][j]);
    for (int j = 1; j <= m - k + 1; ++j) {
      dp[j] = maxv[1] + pref[i][j + k - 1] - pref[i][j - 1];
      if (i != 1 && j != m - k + 1) {
        uadd(1, 1, m - k + 1, max(1, j - k + 1), j, a[i][j]);
        uadd(1, 1, m - k + 1, j + 1, j + k, -a[i][j + k]);
      }
    }
  }
  printf("%d\n", *max_element(dp + 1, dp + MAXN));
  return 0;
}
