#include <bits/stdc++.h>
using namespace std;
long long n, m, k;
long long val[55][20010], rui[55][20010];
long long dp[55][20010];
long long dat[2 * 20010], laz[2 * 20010];
void init() {
  for (int i = 0; i < 2 * 20010; i++) dat[i] = laz[i] = 0;
}
long long eval(long long k) {
  if (k < 20010) laz[k * 2] += laz[k], laz[k * 2 + 1] += laz[k];
  dat[k] += laz[k], laz[k] = 0;
  return dat[k];
}
void add(long long l, long long r, long long x) {
  l = max(l, 0LL);
  r = min(r, m - 1);
  l += 20010, r += 20010 + 1;
  for (long long a = l, b = r; a < b; a >>= 1, b >>= 1) {
    if (a & 1) laz[a++] += x;
    if (b & 1) laz[--b] += x;
  }
  for (long long a = l, b = r; a + b; a >>= 1, b >>= 1) {
    dat[a / 2] = max(eval(a), eval(a ^ 1));
    dat[b / 2] = max(eval(b), eval(b ^ 1));
  }
}
void upd(long long i, long long x) { add(i, i, x); }
long long qry() { return eval(1); }
int main() {
  cin >> n >> m >> k;
  for (int i = 0; i < n; i++) {
    rui[i][0] = 0;
    for (int j = 0; j < m; j++) {
      cin >> val[i][j];
      rui[i][j + 1] = rui[i][j] + val[i][j];
    }
  }
  for (int j = 0; j < m + 1; j++) rui[n][j] = 0;
  for (int j = 0; j < m - k + 1; j++)
    dp[0][j] = rui[0][j + k] - rui[0][j] + rui[1][j + k] - rui[1][j];
  for (int i = 1; i < n; i++) {
    init();
    for (int j = 0; j < m - k + 1; j++) {
      long long f = dp[i - 1][j];
      if (j < k) f -= rui[i][k] - rui[i][j];
      upd(j, f);
    }
    for (int j = 0; j < m - k + 1; j++) {
      dp[i][j] =
          qry() + rui[i][j + k] - rui[i][j] + rui[i + 1][j + k] - rui[i + 1][j];
      add(j - k + 1, j, val[i][j]);
      add(j + 1, j + k, -val[i][j + k]);
    }
  }
  long long ans = 0;
  for (int j = 0; j < m - k + 1; j++) ans = max(ans, dp[n - 1][j]);
  cout << ans << endl;
}
