func_code_string: #include <bits/stdc++.h>   using namespace std;   struct w {     int c, mi;   } tr[1010 * 1010 * 8];   struct ww {     int h, b, l, r, x, y;   } c[1010 * 1010];   int i, j, k, n, m, s, vx, vy, t, ans;   int a[1010][1010], b[1010][1010];   double d[1010 * 1010];   long long an;   inline bool cc1(const ww &a, const ww &b) { return a.b > b.b; }   inline void update(int x) { tr[x].mi = min(tr[x * 2].mi, tr[x * 2 + 1].mi); }   inline void Cover(int x, int y) {     tr[x].c = max(tr[x].c, y);     tr[x].mi = max(tr[x].mi, y);   }   inline void renew(int x) {     if (tr[x].c) Cover(x * 2, tr[x].c), Cover(x * 2 + 1, tr[x].c);     tr[x].c = 0;   }   void cover(int q, int x, int y, int l, int r, int h) {     if (l <= x && y <= r) {       Cover(q, h);       return;     }     renew(q);     int mid = (x + y) / 2;     if (l <= mid) cover(q * 2, x, mid, l, r, h);     if (mid < r) cover(q * 2 + 1, mid + 1, y, l, r, h);     update(q);   }   void cal(int q, int x, int y, int l, int r) {     if (l <= x && y <= r) {       ans = min(ans, tr[q].mi);       return;     }     renew(q);     int mid = (x + y) / 2;     if (l <= mid) cal(q * 2, x, mid, l, r);     if (mid < r) cal(q * 2 + 1, mid + 1, y, l, r);   }   int main() {     scanf( %d%d%d , &n, &vx, &vy);     for (i = 1; i <= n; i++)       for (j = 1; j <= n; j++) scanf( %d , &a[i][j]);     vx = -vx, vy = -vy;     if (vx < 0) {       vx = -vx;       for (j = 1; j <= n; j++)         for (i = 1; i <= n / 2; i++) swap(a[i][j], a[n - i + 1][j]);     }     if (vy < 0) {       vy = -vy;       for (i = 1; i <= n; i++)         for (j = 1; j <= n / 2; j++) swap(a[i][j], a[i][n - j + 1]);     }     if (!vx) {       swap(vx, vy);       for (i = 1; i <= n; i++)         for (j = 1; j <= n; j++) b[i][j] = a[i][j];       for (i = 1; i <= n; i++)         for (j = 1; j <= n; j++) a[j][n - i + 1] = b[i][j];     }     sort(d + 1, d + t + 1);     for (i = 1; i <= t; i++)       if (!m || d[m] < d[i]) d[++m] = d[i];     double ay = 1. * vy / vx;     for (i = 0; i <= n; i++)       for (j = 0; j <= n; j++) d[++m] = j - i * ay;     sort(d + 1, d + m + 1);     for (i = 1; i <= m; i++)       if (!t || d[t] + (1e-9) < d[i]) d[++t] = d[i];     for (i = 1; i <= n; i++)       for (j = 0; j <= n - 1; j++) {         int l = lower_bound(d + 1, d + t + 1, j - i * ay - (1e-9)) - d;         int r = lower_bound(d + 1, d + t + 1, j + 1 - (i - 1) * ay - (1e-9)) - d;         c[++s] = (ww){a[i][j + 1], i + j, l * 2, r * 2};       }     m = t * 2;     sort(c + 1, c + s + 1, cc1);     for (i = 1; i <= s; i++) {       ans = 2000000000;       cal(1, 1, m, c[i].l, c[i].r);       if (ans < c[i].h) an += c[i].h - ans;       cover(1, 1, m, c[i].l, c[i].r, c[i].h);     }     printf( %I64d n , an);     return 0;   }   