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
| #include <bits/stdc++.h> using namespace std; #define int long long
#define int long long
class XDS { private: int cnt; struct as { long long l, r, sum, add, mx, son[2]; }; vector<as> e; #define ls(k) e[k].son[0]
#define rs(k) e[k].son[1]
public: XDS(int m = 2020202, int l = 1, int r = 1e9) { cnt = 1; e = vector<as>(m); e[1].l = l, e[1].r = r; } void up(int k) { e[k].sum = e[ls(k)].sum + e[rs(k)].sum; e[k].mx = max(e[ls(k)].mx, e[rs(k)].mx); } void down(int k) { if (e[k].add) { if (ls(k)) { e[ls(k)].add += e[k].add; e[ls(k)].sum += e[k].add * (e[ls(k)].r - e[ls(k)].l + 1); e[ls(k)].mx += e[k].add; } if (rs(k)) { e[rs(k)].add += e[k].add; e[rs(k)].sum += e[k].add * (e[rs(k)].r - e[rs(k)].l + 1); e[rs(k)].mx += e[k].add; } e[k].add = 0; } } void ADD(int k, int l, int r, int v) { if (e[k].l == l && e[k].r == r) { e[k].add += v; e[k].sum += v * (e[k].r - e[k].l + 1); e[k].mx += v; return; } down(k); int mid = e[k].l + e[k].r >> 1; if (r <= mid) { if (!ls(k)) ls(k) = ++cnt, e[ls(k)].l = e[k].l, e[ls(k)].r = mid; ADD(ls(k), l, r, v); } else if (l > mid) { if (!rs(k)) rs(k) = ++cnt, e[rs(k)].l = mid + 1, e[rs(k)].r = e[k].r; ADD(rs(k), l, r, v); } else { if (!ls(k)) ls(k) = ++cnt, e[ls(k)].l = e[k].l, e[ls(k)].r = mid; if (!rs(k)) rs(k) = ++cnt, e[rs(k)].l = mid + 1, e[rs(k)].r = e[k].r; ADD(ls(k), l, mid, v); ADD(rs(k), mid + 1, r, v); } up(k); } long long Query(int k, int l, int r) { if (!k) return 0; if (e[k].l == l && e[k].r == r) return e[k].sum; down(k); int mid = e[k].l + e[k].r >> 1; if (r <= mid) { if (ls(k)) return Query(ls(k), l, r); else return 0; } else if (l > mid) { if (rs(k)) return Query(rs(k), l, r); else return 0; } else return Query(ls(k), l, mid) + Query(rs(k), mid + 1, r); } long long Query_max(int k, int l, int r) { if (!k) return 0; if (e[k].l == l && e[k].r == r) return e[k].mx; down(k); int mid = e[k].l + e[k].r >> 1; if (r <= mid) { if (ls(k)) return Query_max(ls(k), l, r); else return 0; } else if (l > mid) { if (rs(k)) return Query_max(rs(k), l, r); else return 0; } else return max(Query_max(ls(k), l, mid), Query_max(rs(k), mid + 1, r)); } }; signed main() { XDS tr(2400000); int n; cin >> n; for (int i = 1; i <= n; i++) { int m; cin >> m; tr.ADD(1, m, m, m); } int q; cin>>q; for(int i=1;i<=q;i++){ int t1,t2,t3; cin>>t1; if(t1==1){ cin>>t2; tr.ADD(1,t2,t2,t2); }else if(t1==2){ cin>>t2; tr.ADD(1,t2,t2,-t2); }else { cin>>t2>>t3; cout<<tr.Query(1,t2,t3)<<endl; } } return 0; }
|