rt,代码如下
#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(register int (x)=(y);(x)>=(z);(x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{
char ch=getchar();lx x=0,f=1;
for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
return x*f;
}
#undef lx
#define qr qr()
#define fi first
#define se second
const int Ratio=0;
const int N=2e5+5;
int n,m,cnt;
int rot[N];
int son[N*32][2];
ll a[N],v[N*32],lazy[N*32];
namespace Wisadel
{
#define ls (son[rt][0])
#define rs (son[rt][1])
#define mid ((l+r)>>1)
int Wclone(int rt)
{
son[++cnt][0]=son[rt][0];
son[cnt][1]=son[rt][1];
v[cnt]=v[rt];
lazy[cnt]=lazy[rt];
return cnt;
}
void Wpushup(int rt)
{
v[rt]=v[ls]+v[rs];
}
void Wpushdown(int rt,int l,int r)
{
ls=Wclone(ls),rs=Wclone(rs);
lazy[ls]=lazy[ls]+lazy[rt];
lazy[rs]=lazy[rs]+lazy[rt];
v[ls]=v[ls]+lazy[rt]*(((l+r)>>1)-l+1);
v[rs]=v[rs]+lazy[rt]*(r-((l+r)>>1));
lazy[rt]=0;
}
int Wbuild(int rt,int l,int r)
{
rt=++cnt;
if(l==r)
{
v[rt]=a[l];
return rt;
}
ls=Wbuild(ls,l,mid),rs=Wbuild(rs,mid+1,r);
Wpushup(rt);
return rt;
}
int Wupd(int rt,int l,int r,int x,int y,ll va)
{
rt=Wclone(rt);
if(x<=l&&r<=y)
{
lazy[rt]=lazy[rt]+va;
v[rt]=v[rt]+1ll*(r-l+1)*va;
return rt;
}
if(lazy[rt]) Wpushdown(rt,l,r);
if(x<=mid) ls=Wupd(ls,l,mid,x,y,va);
if(y>mid) rs=Wupd(rs,mid+1,r,x,y,va);
Wpushup(rt);
return rt;
}
ll Wq(int rt,int l,int r,int x,int y)
{
if(x<=l&&r<=y) return v[rt];
if(lazy[rt]) Wpushdown(rt,l,r);
ll res=0;
if(x<=mid) res+=Wq(ls,l,mid,x,y);
if(y>mid) res+=Wq(rs,mid+1,r,x,y);
return res;
}
short main()
{
n=qr,m=qr;
fo(i,1,n) a[i]=qr;
rot[0]=Wbuild(1,1,n);
int tim=0;
fo(i,1,m)
{
char ch;cin>>ch;
int x=qr,y;ll va;
if(ch=='C') y=qr,va=qr,rot[++tim]=Wupd(rot[tim],1,n,x,y,va);
else if(ch=='Q') y=qr,printf("%lld\n",Wq(rot[tim],1,n,x,y));
else if(ch=='B') tim=x;
else y=qr,va=qr,printf("%lld\n",Wq(rot[va],1,n,x,y));
}
return Ratio;
}
}
int main(){return Wisadel::main();}