func_code_string: #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;   }   