和正解拍了2000组没错但WA求条
查看原帖
和正解拍了2000组没错但WA求条
1219462
Ratio_Y楼主2024/8/20 11:57

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();}
2024/8/20 11:57
加载中...