1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <bits/stdc++.h> #define debug(x) cout << #x << ":\t" << (x) << endl; using namespace std; #define ll long long #define ull unsigned ll const int N = 2010; const int INF = 0x3f3f3f3f; const ll inf = 0x3f3f3f3f3f3f3f3f; const ll mod = 1e9 + 7; const ll inv2 = (mod + 1) / 2; int n, m1, m2; ll a[N][N]; ll tr[N*N * 4]; void up(int rt) { tr[rt] = max(tr[rt << 1], tr[rt << 1 | 1]); } void build(int xl, int xr, int yl, int yr, int rt, int flg) { if (xl > xr || yl > yr)return; if (xl == xr && yl == yr) { tr[rt] = a[xl][yl]; return; } if (flg) { int mid = ((xl + xr) >> 1); build(xl, mid, yl, yr, rt << 1, flg ^ 1); build(mid + 1, xr, yl, yr, rt << 1 | 1, flg ^ 1); up(rt); } else { int mid = ((yl + yr) >> 1); build(xl, xr, yl, mid, rt << 1, flg ^ 1); build(xl, xr, mid + 1, yr, rt << 1 | 1, flg ^ 1); up(rt); } } ll ans; void qry(int qxl, int qxr, int qyl, int qyr, int xl, int xr, int yl, int yr, int rt, int flg) { if (qxl <= xl && qxr >= xr && qyl <= yl && qyr >= yr) { ans = max(ans, tr[rt]); return; } if (flg) { int mid = ((xl + xr) >> 1); if (qxl <= mid)qry(qxl, qxr, qyl, qyr, xl, mid, yl, yr, rt << 1, flg ^ 1); if (qxr > mid && ans < tr[rt << 1 | 1])qry(qxl, qxr, qyl, qyr, mid + 1, xr, yl, yr, rt << 1 | 1, flg ^ 1); } else { int mid = ((yl + yr) >> 1); if (qyl <= mid)qry(qxl, qxr, qyl, qyr, xl, xr, yl, mid, rt << 1, flg ^ 1); if (qyr > mid && ans < tr[rt << 1 | 1])qry(qxl, qxr, qyl, qyr, xl, xr, mid + 1, yr, rt << 1 | 1, flg ^ 1); } } int main() { scanf("%d%d%d", &n, &m1, &m2); while (m1--) { int x1, y1, x2, y2, w; scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &w); a[x1][y1] += w; a[x2 + 1][y2 + 1] += w; a[x1][y2 + 1] -= w; a[x2 + 1][y1] -= w; } for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++) { a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1]; } build(1, n, 1, n, 1, 1); while (m2--) { int x1, y1, x2, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); ans = 0; qry(x1, x2, y1, y2, 1, n, 1, n, 1, 1); printf("%lld\n", ans); } return 0; }
|