//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define LL long long
#define pii pair<int, int>
#define MP make_pair
//#define ls i << 1
//#define rs ls | 1
#define md (ll + rr >> 1)
#define lson ll, md, ls
#define rson md + 1, rr, rs
#define mod 1000000007
#define inf 0x3f3f3f3f
#define N 100020
#define M 500010
int ch[N*80][2], down[N*80], con[N*80], tot;
LL sum[N*80];
int a[N], rt[N];
void copy(int k, int i){
ch[k][0] = ch[i][0], ch[k][1] = ch[i][1];
down[k] = down[i];
sum[k] = sum[i];
}
void push_up(int i){
sum[i] = sum[ch[i][0]] + sum[ch[i][1]];
}
void push_down(int i, int ll, int rr){
if(con[i]){
int ls = ch[i][0], rs = ch[i][1];
int k = ++tot;
ch[i][0] = k;
copy(k, ls);
k = ++tot;
ch[i][1] = k;
copy(k, rs);
con[ch[i][0]] = con[ch[i][1]] = 1;
con[i] = 0;
}
if(down[i]){
int ls = ch[i][0], rs = ch[i][1];
down[ls] += down[i];
down[rs] += down[i];
sum[ls] += 1LL * down[i] * (md - ll + 1);
sum[rs] += 1LL * down[i] * (rr - md);
down[i] = 0;
}
}
int build(int ll, int rr){
int k = ++tot;
ch[k][0] = ch[k][1] = 0;
if(ll == rr){
sum[k] = a[ll];
return k;
}
ch[k][0] = build(ll, md);
ch[k][1] = build(md + 1, rr);
push_up(k);
return k;
}
int update(int l, int r, int d, int ll, int rr, int i){
int k = ++tot;
if(l <= ll && r >= rr){
ch[k][0] = ch[i][0], ch[k][1] = ch[i][1];
down[k] = down[i] + d;
sum[k] = sum[i] + 1LL * d * (rr - ll + 1);
con[k] = 1;
return k;
}
push_down(i, ll, rr);
ch[k][0] = ch[i][0], ch[k][1] = ch[i][1];
if(r <= md) ch[k][0] = update(l, r, d, ll, md, ch[i][0]);
else if(l > md) ch[k][1] = update(l, r, d, md + 1, rr, ch[i][1]);
else{
ch[k][0] = update(l, md, d, ll, md, ch[i][0]);
ch[k][1] = update(md + 1, r, d, md + 1, rr, ch[i][1]);
}
push_up(i);
push_up(k);
return k;
}
LL query(int l, int r, int ll, int rr, int i){
if(l <= ll && r >= rr)
return sum[i];
push_down(i, ll, rr);
LL ret = 0;
if(r <= md) ret = query(l, r, ll, md, ch[i][0]);
else if(l > md) ret = query(l, r, md + 1, rr, ch[i][1]);
else ret = query(l, md, ll, md, ch[i][0]) + query(md + 1, r, md + 1, rr, ch[i][1]);
push_up(i);
return ret;
}
int main(){
int n, m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
rt[0] = build(1, n);
int cur = 0;
while(m--){
char s[5];
scanf("%s", s);
if(s[0] == 'C'){
int l, r, d;
scanf("%d%d%d", &l, &r, &d);
rt[cur+1] = update(l, r, d, 1, n, rt[cur]);
cur++;
}
else if(s[0] == 'Q'){
int l, r;
scanf("%d%d", &l, &r);
printf("%lld\n", query(l, r, 1, n, rt[cur]));
}
else if(s[0] == 'H'){
int l, r, t;
scanf("%d%d%d", &l, &r, &t);
printf("%lld\n", query(l, r, 1, n, rt[t]));
}
else
scanf("%d", &cur);
}
return 0;
}
SPOJ TTM To the moon(主席树)
最新推荐文章于 2021-06-15 16:18:10 发布