RT
调不出来,求hack (个人认为题目还是比较好理解的)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
struct node{
int l,r,sum,tag;
void clear(){
l = r = sum = tag = 0;
return ;
}
}tree[((N << 5) + N) * 2];
int a[N];
int tot = N;
int nw;
int n,Q;
void pushup(int p){
int lx = tree[p].l;
int rx = tree[p].r;
tree[p].sum = tree[lx].sum + tree[rx].sum;
return ;
}
int insert(int p,int l,int r,int x,int u){
if(p == 0)p = ++tot;
if(l == r){
tree[p].sum += u;
return p;
}
int mid = l + r >> 1;
int lx = tree[p].l;
int rx = tree[p].r;
if(x <= mid){
tree[p].l = insert(lx,l,mid,x,u);
}else{
tree[p].r = insert(rx,mid + 1,r,x,u);
}
pushup(p);
return p;
}
int repair(int p1,int p2,int l,int r,int b,int e,int u){
if(p2 == 0)p2 = ++tot;
if(l > e || r < b){
tree[p2] = tree[p1];
return p2;
}
if(b <= l && r <= e){
tree[p2] = tree[p1];
tree[p2].tag += u;
tree[p2].sum += u * (r - l + 1);
return p2;
}
int mid = l + r >> 1;
int lx1 = tree[p1].l;
int rx1 = tree[p1].r;
int lx2 = tree[p2].l;
int rx2 = tree[p2].r;
tree[p2].l = repair(lx1,lx2,l,mid,b,e,u);
tree[p2].r = repair(rx1,rx2,mid + 1,r,b,e,u);
pushup(p2);
// cout<<l<<' '<<r<<' '<<tree[p2].sum <<endl;
return p2;
}
int solve(int p,int l,int r,int b,int e){
if(p == 0)return 0;
if(l > e || r < b)return 0;
if(b <= l && r <= e)return tree[p].sum;
int lx = tree[p].l;
int rx = tree[p].r;
int mid = l + r >> 1;
int add = (min(e,r) - max(b,l) + 1) * tree[p].tag;
return solve(lx,l,mid,b,e) + solve(rx,mid + 1,r,b,e) + add;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> n >> Q;
nw = 1;
for(int i = 1;i <= n;i ++){
cin >> a[i];
insert(nw,1,n,i,a[i]);
}
while(Q--){
char op;
int l,r,u;
cin >> op;
if(op == 'Q'){
cin >> l >> r;
cout<<solve(nw,1,n,l,r)<<'\n';
}else if(op == 'C'){
cin >> l >> r >> u;
nw++;
tree[nw].clear();
repair(nw - 1,nw,1,n,l,r,u);
}else if(op == 'H'){
cin >> l >> r >> u;
cout<<solve(u + 1,1,n,l,r)<<'\n';
}else{
cin >> u;
nw = u + 1;
}
}
return 0;
}
/*
10 3
1 2 3 4 5 6 7 8 9 10
C 3 6 3
C 3 6 3
Q 3 6
*/