#include <bits/stdc++.h>
using namespace std;
const int MN = 55;
const int MM = 20020;
long long ctr[MN][MM];
long long rs[MN][MM];
class ST {
 private:
  int n, h;
  vector<long long> st, lz;
  const long long STV = -1LL << 62;
  int log2(int v) {
    if (v <= 1) return 1;
    return log2(v / 2) + 1;
  }
  void ap(int p, int val) {
    st[p] += val;
    if (p < n) {
      lz[p] += val;
    }
  }
  void build(int p) {
    while (p > 1) {
      p >>= 1;
      if (p >= n) continue;
      st[p] = max(st[p << 1], st[p << 1 | 1]) + lz[p];
    }
  }
  void psh(int p) {
    for (int s = h; s > 0; s--) {
      int i = p >> s;
      if (lz[i] != 0) {
        ap(i << 1, lz[i]);
        ap(i << 1 | 1, lz[i]);
        lz[i] = 0;
      }
    }
  }

 public:
  ST(int _n) {
    n = _n;
    h = log2(n);
    st.assign(2 * n, 0);
    lz.assign(n, 0);
  }
  void up(int l, int r, long long val) {
    if (l >= r) return;
    l += n;
    r += n;
    int li = l, ri = r;
    for (; l < r; l >>= 1, r >>= 1) {
      if (l & 1) {
        ap(l++, val);
      }
      if (r & 1) {
        ap(--r, val);
      }
    }
    build(li);
    build(ri - 1);
  }
  long long qu(int l, int r) {
    l += n;
    r += n;
    psh(l);
    psh(r - 1);
    long long res = STV;
    for (; l < r; l >>= 1, r >>= 1) {
      if (l & 1) {
        res = max(res, st[l++]);
      }
      if (r & 1) {
        res = max(res, st[--r]);
      }
    }
    return res;
  }
};
long long rv[MM];
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, m, k;
  cin >> n >> m >> k;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> ctr[i][j];
    }
  }
  memset(rs, 0, sizeof(rs));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      rs[i][j + 1] = rs[i][j] + ctr[i][j];
    }
  }
  long long res = 0;
  memset(rv, 0, sizeof(rv));
  for (int i = n - 1; i >= 0; i--) {
    ST bs(m - k + 1);
    for (int j = 0; j < m - k + 1; j++) {
      bs.up(j, j + 1, rv[j]);
      bs.up(j, j + 1, rs[i + 1][j + k] - rs[i + 1][j]);
    }
    for (int j = 0; j < m; j++) {
      int st = max(0, j - k + 1);
      int ed = min(m - k + 1, j + 1);
      bs.up(st, ed, ctr[i][j]);
    }
    if (i == 0) {
      res = bs.qu(0, m - k + 1);
    }
    for (int j = 0; j < k - 1; j++) {
      int st = max(0, j - k + 1);
      int ed = min(m - k + 1, j + 1);
      bs.up(st, ed, -ctr[i][j]);
    }
    for (int j = k - 1; j < m; j++) {
      int st = max(0, j - k + 1);
      int ed = min(m - k + 1, j + 1);
      bs.up(st, ed, -ctr[i][j]);
      rv[j - k + 1] = bs.qu(0, m - k + 1);
      st = max(0, (j - k + 1) - k + 1);
      ed = min(m - k + 1, (j - k + 1) + 1);
      bs.up(st, ed, ctr[i][j - k + 1]);
    }
  }
  cout << res << '\n';
}
