可持久化文艺平衡树wa30求助
查看原帖
可持久化文艺平衡树wa30求助
289304
HAuCl4楼主2023/2/25 22:15

RT

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=200005*50,M=200005;
int sz=0;
ll v[N];
int w[N],s[N],ch[N][2],fp[N];
ll sum[N];
int rt[M];
int clone(int u)
{
	int t=++sz;
	v[t]=v[u],w[t]=w[u],s[t]=s[u],sum[t]=sum[u];
	ch[t][0]=ch[u][0],ch[t][1]=ch[u][1];
	return t;
}
void down(int x)
{
    if(x&&fp[x])
    {
        fp[x]=0;
        swap(ch[x][0],ch[x][1]);
        if(ch[x][0]) fp[ch[x][0]]^=1;
        if(ch[x][1]) fp[ch[x][1]]^=1;
    }
}
void up(int k)
{
    s[k]=s[ch[k][0]]+s[ch[k][1]]+1;
    sum[k]=sum[ch[k][0]]+sum[ch[k][1]]+v[k];
}
void split(int u,int k,int &x,int &y)
{
    if(!u) x=y=0;
    else
    {
        down(u);
        if(k<=s[ch[u][0]])
        {
            y=clone(u);
            split(ch[y][0],k,x,ch[y][0]);
            up(y);
        }
        else
        {
            x=clone(u);
            split(ch[x][1],k-s[ch[x][0]]-1,ch[x][1],y);
            up(x);
        }
    }
}
int merge(int x,int y)
{
    if(!x || !y) return x+y;
    down(x);
    down(y);
    if(w[x]<w[y])
    {
        ch[x][1]=merge(ch[x][1],y);
        up(x);
        return x;
    }
    else
    {
        ch[y][0]=merge(x,ch[y][0]);
        up(y);
        return y;
    }
}
int new_node(ll _v)
{
    ++sz;
    sum[sz]=v[sz]=_v;
    w[sz]=rand();
    s[sz]=1;
    ch[sz][0]=ch[sz][1]=0;
    fp[sz]=0;
    return sz;
}
void insert(int &rt,int u,int v)
{
    int x,y;
    split(rt,u,x,y);
    rt=merge(merge(x,new_node(v)),y);
}
void del(int &rt,int k)
{
	int x,y,z;
	split(rt,k,x,z);
	split(x,k-1,x,y);
	y=merge(ch[y][0],ch[y][1]);
	rt=merge(merge(x,y),z);
}
void flip(int &rt,int l,int r)
{
    int a,b,c,d;
    split(rt,r,a,b);
    split(a,l-1,c,d);
    fp[d]^=1;
    rt=merge(merge(c,d),b);
}
ll q(int &rt,int l,int r)
{
	int a,b,c,d;
	split(rt,r,a,b);
	split(a,l-1,c,d);
	ll ret=sum[d];
	rt=merge(merge(c,d),b);
	return ret;
}
void dfs(int x)
{
    if(!x) return;
    down(x);
    dfs(ch[x][0]);
    printf("%d ",v[x]);
    dfs(ch[x][1]);
}
int main()
{
    int n;
	ll v,op,p,l,r;
    ll x;
    srand(time(0));
    scanf("%d",&n);
   /* for(int i=1;i<=n;i++) insert(rt,i-1,i);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&l,&r);
        flip(l,r);
    }
    dfs(rt);*/
    ll A=0;
    for(int i=1;i<=n;i++)
    {
    	scanf("%lld%lld",&v,&op);
    	rt[i]=rt[v];
    	switch(op)
    	{
    		case 1:{
    			scanf("%lld%lld",&p,&x);
    			p^=A,x^=A;
    			insert(rt[i],p,x);
				break;
			}
			case 2:{
				scanf("%lld",&p);
				p^=A;
				del(rt[i],p);
				break;
			}
			case 3:{
				scanf("%lld%lld",&l,&r);
				l^=A,r^=A;
				flip(rt[i],l,r);
				break;
			}
			case 4:{
				scanf("%lld%lld",&l,&r);
				l^=A,r^=A;
				printf("%lld\n",A=q(rt[i],l,r));
				break;
			}
		}
	}
    return 0;
}
2023/2/25 22:15
加载中...