#include <bits/stdc++.h>
using namespace std;
const long long INF = (long long)1e18 + 5;
const long long MOD = (long long)1e9 + 7;
const int MAXN = 55;
const int MAXM = 20005;
struct ST {
  long long val[4 * MAXM], add[4 * MAXM];
  void init(int l, int r, int idx) {
    add[idx] = val[idx] = 0;
    if (l == r) {
      return;
    }
    int m = (l + r) >> 1;
    init(l, m, idx << 1);
    init(m + 1, r, idx << 1 | 1);
  }
  long long RMQ(int ql, int qr, int l, int r, int idx) {
    assert(ql <= qr);
    if (ql <= l && r <= qr) {
      return val[idx];
    }
    long long m = (l + r) >> 1, ans = -INF;
    if (ql <= m) ans = max(ans, RMQ(ql, qr, l, m, idx << 1) + add[idx]);
    if (qr > m) ans = max(ans, RMQ(ql, qr, m + 1, r, idx << 1 | 1) + add[idx]);
    return ans;
  }
  void range_add(int ql, int qr, long long v, int l, int r, int idx) {
    assert(ql <= qr);
    if (ql <= l && r <= qr) {
      add[idx] += v;
      val[idx] += v;
      return;
    }
    int m = (l + r) >> 1;
    if (ql <= m) range_add(ql, qr, v, l, m, idx << 1);
    if (qr > m) range_add(ql, qr, v, m + 1, r, idx << 1 | 1);
    val[idx] = max(val[idx << 1], val[idx << 1 | 1]) + add[idx];
  }
} tree;
int n, m, k;
long long sum[MAXN][MAXM], dp[MAXN][MAXM];
long long range_sum(int r1, int c1, int r2, int c2) {
  assert(r1 <= r2 && c1 <= c2);
  return sum[r2][c2] - sum[r2][c1 - 1] - sum[r1 - 1][c2] + sum[r1 - 1][c1 - 1];
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m >> k;
  for (int i = 1; i <= n + 1; i++) {
    for (int j = 1; j <= m; j++) {
      if (i <= n) {
        cin >> sum[i][j];
      }
      sum[i][j] += sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1];
    }
  }
  for (int i = n; i >= 1; i--) {
    tree.init(1, m, 1);
    for (int j = 1; j <= m; j++) {
      long long p = range_sum(i, max(1, j - k + 1), i + 1, j);
      if (i != 1 && j >= m - k + 1) {
        p -= range_sum(i, m - k + 1, i, j);
      }
      tree.range_add(j, j, p + dp[i + 1][j], 1, m, 1);
    }
    for (int j = m; j >= 1; j--) {
      dp[i][j] = tree.RMQ(1, m, 1, m, 1);
      if (i != 1 && j > 1) {
        long long r = range_sum(i, j, i, j);
        tree.range_add(j, min(m, j + k - 1), r, 1, m, 1);
        if (j - k >= 1) {
          long long l = range_sum(i, j - k, i, j - k);
          tree.range_add(j - k, j - 1, -l, 1, m, 1);
        }
      }
    }
  }
  cout << *max_element(dp[1] + 1, dp[1] + 1 + m) << '\n';
  return 0;
}
