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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
| #include <bits/stdc++.h>
using u64 = uint64_t;
const int kMaxN = 2.5e5 + 5;
struct Node { u64 sumx, sumy, sumxy, sum;
Node() {} Node(u64 _sumx, u64 _sumy, u64 _sumxy, u64 _sum) : sumx(_sumx), sumy(_sumy), sumxy(_sumxy), sum(_sum) {}
friend Node operator +(Node n1, Node n2) { return {n1.sumx + n2.sumx, n1.sumy + n2.sumy, n1.sumxy + n2.sumxy, n1.sum + n2.sum}; } } t[kMaxN * 4];
struct Tag { u64 setx, sety, addx, addy, addxy, addc;
Tag() {} Tag(u64 _setx, u64 _sety, u64 _addx, u64 _addy, u64 _addxy, u64 _addc) : setx(_setx), sety(_sety), addx(_addx), addy(_addy), addxy(_addxy), addc(_addc) {}
friend Tag operator +(Tag t1, Tag t2) { Tag ret = t1; if (t2.setx) ret.setx = t2.setx; if (t2.sety) ret.sety = t2.sety; if (t1.setx) { ret.addc += t1.setx * t2.addx; if (t1.sety) ret.addc += t1.sety * t2.addy + t1.setx * t1.sety * t2.addxy; else ret.addy += t2.addy + t1.setx * t2.addxy; } else { ret.addx += t2.addx; if (t1.sety) ret.addx += t1.sety * t2.addxy, ret.addc += t1.sety * t2.addy; else ret.addy += t2.addy, ret.addxy += t2.addxy; } ret.addc += t2.addc; return ret; } } tag[kMaxN * 4];
int n, q; int a[kMaxN], b[kMaxN], la[kMaxN], lb[kMaxN], stka[kMaxN], stkb[kMaxN]; u64 ans[kMaxN]; std::vector<std::pair<int, int>> vec[kMaxN];
Node merge(Node a, Tag t, int len) { Node ret = a; if (t.setx) ret.sumx = t.setx * len; if (t.sety) ret.sumy = t.sety * len;
if (t.setx && t.sety) ret.sumxy = t.setx * t.sety * len; else if (t.setx) ret.sumxy = t.setx * a.sumy; else if (t.sety) ret.sumxy = t.sety * a.sumx; ret.sum += a.sumx * t.addx + a.sumy * t.addy + a.sumxy * t.addxy + t.addc * len; return ret; }
struct SGT { Node t[kMaxN * 4]; Tag tag[kMaxN * 4];
void pushup(int x) { t[x] = t[x << 1] + t[x << 1 | 1]; }
void addtag(int x, int l, int r, Tag tg) { t[x] = merge(t[x], tg, r - l + 1), tag[x] = tag[x] + tg; }
void pushdown(int x, int l, int r) { if (!tag[x].setx && !tag[x].sety && !tag[x].addx && !tag[x].addy && !tag[x].addxy && !tag[x].addc) return; int mid = (l + r) >> 1; addtag(x << 1, l, mid, tag[x]), addtag(x << 1 | 1, mid + 1, r, tag[x]); tag[x] = {0, 0, 0, 0, 0, 0}; }
void update(int x, int l, int r, int ql, int qr, Tag t) { if (l > qr || r < ql) { return; } else if (l >= ql && r <= qr) { return addtag(x, l, r, t); } pushdown(x, l, r); int mid = (l + r) >> 1; update(x << 1, l, mid, ql, qr, t), update(x << 1 | 1, mid + 1, r, ql, qr, t); pushup(x); }
u64 query(int x, int l, int r, int ql, int qr) { if (l > qr || r < ql) { return 0; } else if (l >= ql && r <= qr) { return t[x].sum; } pushdown(x, l, r); int mid = (l + r) >> 1; return query(x << 1, l, mid, ql, qr) + query(x << 1 | 1, mid + 1, r, ql, qr); } } sgt;
void dickdreamer() { int _case; std::cin >> _case >> n; for (int i = 1; i <= n; ++i) std::cin >> a[i]; for (int i = 1; i <= n; ++i) std::cin >> b[i]; std::cin >> q; for (int i = 1; i <= q; ++i) { int l, r; std::cin >> l >> r; vec[r].emplace_back(l, i); } int topa = 0, topb = 0; for (int i = 1; i <= n; ++i) { for (; topa && a[stka[topa]] < a[i]; --topa) {} for (; topb && b[stkb[topb]] < b[i]; --topb) {} la[i] = stka[topa], lb[i] = stkb[topb]; stka[++topa] = i, stkb[++topb] = i; sgt.update(1, 1, n, la[i] + 1, i, {a[i], 0, 0, 0, 0, 0}); sgt.update(1, 1, n, lb[i] + 1, i, {0, b[i], 0, 0, 0, 0}); sgt.update(1, 1, n, 1, i, {0, 0, 0, 0, 1, 0}); for (auto p : vec[i]) ans[p.second] = sgt.query(1, 1, n, p.first, i); } for (int i = 1; i <= q; ++i) std::cout << ans[i] << '\n'; }
int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; while (T--) dickdreamer(); return 0; }
|