代码如下
#include<iostream>
#include<cstdio>
#define N 100005
#define ll long long
using namespace std;
struct xds{
ll lz,rz,z,l,r,z1;
}yd[N*50];
ll n,m,a[N],cnt,rt[N];
void js(ll &b,ll l,ll r){
b=++cnt;
yd[b].l=l,yd[b].r=r;
if(l==r){
yd[b].z=a[yd[b].l]-a[yd[b].l-1];
yd[b].z1=(a[yd[b].l]-a[yd[b].l-1])*(yd[b].l-1);
// cout<<l<<' '<<r<<' '<<yd[b].z1<<' '<<yd[b].z<<endl;
return;
}
ll mid=(l+r)>>1;
js(yd[b].lz,l,mid);
js(yd[b].rz,mid+1,r);
yd[b].z=yd[yd[b].lz].z+yd[yd[b].rz].z;
yd[b].z1=yd[yd[b].lz].z1+yd[yd[b].rz].z1;
}
ll md(ll b){
ll nb=++cnt;
yd[nb]=yd[b];
return nb;
}
ll gd(ll b,ll z,ll x){
b=md(b);
if(yd[b].l==yd[b].r){
yd[b].z+=z;
yd[b].z1+=z*(x-1);
return b;
}
ll mid=(yd[b].l+yd[b].r)>>1;
if(x<=mid)yd[b].lz=gd(yd[b].lz,z,x);
else yd[b].rz=gd(yd[b].rz,z,x);
yd[b].z=yd[yd[b].lz].z+yd[yd[b].rz].z;
yd[b].z1=yd[yd[b].lz].z1+yd[yd[b].rz].z1;
return b;
}
ll cx(ll b,ll x,ll y){
if(yd[b].l>=x&&yd[b].r<=y){
// cout<<yd[b].l<<' '<<yd[b].r<<endl;
return yd[b].z*y-yd[b].z1;
}
ll mid=(yd[b].l+yd[b].r)>>1;
ll s=0;
if(x<=mid)s+=cx(yd[b].lz,x,y);
if(y>mid) s+=cx(yd[b].rz,x,y);
return s;
}
int main(){
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
ll dc=a[i]-a[i-1];
}
js(rt[0],1,n);
ll bb,cc,dd;
char aa;
ll dt=0;
for(ll i=1;i<=m;i++){
aa=getchar();
while(aa!='Q'&&aa!='C'&&aa!='H'&&aa!='B')aa=getchar();
scanf("%lld",&bb);
if(aa=='B'){
dt=bb;
}
else{
scanf("%lld",&cc);
if(aa=='Q'){
ll ans=cx(rt[dt],1,cc)-(bb==1?0:cx(rt[dt],1,bb-1));
printf("%lld\n",ans);
}
else{
scanf("%lld",&dd);
if(aa=='H'){
ll ans=cx(rt[dd],1,cc)-(bb==1?0:cx(rt[dd],1,bb-1));
printf("%lld",ans);
}
else{
dt++;
rt[dt]=rt[dt-1];
rt[dt]=gd(rt[dt],dd,bb);
rt[dt]=gd(rt[dt],-dd,cc+1);
}
}
}
}
return 0;
}