主席树区间更新,延迟标记。
1 /* 4348 */ 2 #include <iostream> 3 #include <sstream> 4 #include <string> 5 #include <map> 6 #include <queue> 7 #include <set> 8 #include <stack> 9 #include <vector> 10 #include <deque> 11 #include <algorithm> 12 #include <cstdio> 13 #include <cmath> 14 #include <ctime> 15 #include <cstring> 16 #include <climits> 17 #include <cctype> 18 #include <cassert> 19 #include <functional> 20 #include <iterator> 21 #include <iomanip> 22 using namespace std; 23 //#pragma comment(linker,"/STACK:102400000,1024000") 24 25 #define sti set<int> 26 #define stpii set<pair<int, int> > 27 #define mpii map<int,int> 28 #define vi vector<int> 29 #define pii pair<int,int> 30 #define vpii vector<pair<int,int> > 31 #define rep(i, a, n) for (int i=a;i<n;++i) 32 #define per(i, a, n) for (int i=n-1;i>=a;--i) 33 #define clr clear 34 #define pb push_back 35 #define mp make_pair 36 #define fir first 37 #define sec second 38 #define all(x) (x).begin(),(x).end() 39 #define SZ(x) ((int)(x).size()) 40 // #define lson l, mid, rt<<1 41 // #define rson mid+1, r, rt<<1|1 42 43 const int maxn = 1e5+5; 44 const int maxm = 5e6+5; 45 int T[maxn]; 46 int lson[maxm], rson[maxm]; 47 __int64 sum[maxm], delta[maxm]; 48 int a[maxn]; 49 int tot, n, q; 50 51 inline void PushUp(int rt) { 52 sum[rt] = sum[lson[rt]] + sum[rson[rt]]; 53 } 54 55 void init() { 56 tot = 0; 57 } 58 59 int Build(int l, int r) { 60 int rt = tot++; 61 delta[rt] = 0; 62 63 if (l == r) { 64 sum[rt] = a[l]; 65 return rt; 66 } 67 68 int mid = (l + r) >> 1; 69 70 lson[rt] = Build(l, mid); 71 rson[rt] = Build(mid+1, r); 72 73 PushUp(rt); 74 return rt; 75 } 76 77 void copy(int d, int s) { 78 lson[d] = lson[s]; 79 rson[d] = rson[s]; 80 delta[d] = delta[s]; 81 sum[d] = sum[s]; 82 } 83 84 int Update(int rt, int L, int R, int val, int l, int r) { 85 int nrt = tot++; 86 87 copy(nrt, rt); 88 sum[nrt] += 1LL * val * (R - L + 1); 89 if (L==l && R==r) { 90 delta[nrt] += val; 91 return nrt; 92 } 93 94 int mid = (l + r) >> 1; 95 96 if (R <= mid) { 97 lson[nrt] = Update(lson[rt], L, R, val, l, mid); 98 } else if (L > mid) { 99 rson[nrt] = Update(rson[rt], L, R, val, mid+1, r); 100 } else { 101 lson[nrt] = Update(lson[rt], L, mid, val, l, mid); 102 rson[nrt] = Update(rson[rt], mid+1, R, val, mid+1, r); 103 } 104 105 return nrt; 106 } 107 108 __int64 Query(int rt, int L, int R, int l, int r) { 109 if (L==l && R==r) { 110 return sum[rt]; 111 } 112 113 int mid = (l + r) >> 1; 114 __int64 ret = 1LL * (R-L+1) * delta[rt]; 115 116 if (R <= mid) { 117 ret += Query(lson[rt], L, R, l, mid); 118 } else if (L > mid) { 119 ret += Query(rson[rt], L, R, mid+1, r); 120 } else { 121 ret += Query(lson[rt], L, mid, l, mid); 122 ret += Query(rson[rt], mid+1, R, mid+1, r); 123 } 124 125 return ret; 126 } 127 128 void solve() { 129 int cur = 0; 130 char op[4]; 131 int l, r, d, t; 132 __int64 ans; 133 134 init(); 135 T[0] = Build(1, n); 136 while (q--) { 137 scanf("%s", op); 138 if (op[0] == ‘B‘) { 139 scanf("%d", &cur); 140 } else if (op[0] == ‘Q‘) { 141 scanf("%d %d", &l, &r); 142 t = cur; 143 ans = Query(T[t], l, r, 1, n); 144 printf("%I64d\n", ans); 145 } else if (op[0] == ‘H‘) { 146 scanf("%d %d %d", &l, &r, &t); 147 ans = Query(T[t], l, r, 1, n); 148 printf("%I64d\n", ans); 149 } else { 150 scanf("%d %d %d", &l, &r, &d); 151 T[cur+1] = Update(T[cur], l, r, d, 1, n); 152 ++cur; 153 } 154 } 155 } 156 157 int main() { 158 ios::sync_with_stdio(false); 159 #ifndef ONLINE_JUDGE 160 freopen("data.in", "r", stdin); 161 freopen("data.out", "w", stdout); 162 #endif 163 164 while (scanf("%d %d", &n, &q)!=EOF) { 165 rep(i, 1, n+1) 166 scanf("%d", &a[i]); 167 solve(); 168 } 169 170 #ifndef ONLINE_JUDGE 171 printf("time = %d.\n", (int)clock()); 172 #endif 173 174 return 0; 175 }
时间: 2024-10-07 22:44:57