数组版FHQ Teap RE求调
查看原帖
数组版FHQ Teap RE求调
866613
sansesantongshun楼主2024/5/28 21:50

指针版

数组版

#include<bits/stdc++.h>
using namespace std;
int n,root[200005],a[25600005],c[25600005],e[25600005],l[25600005],r[25600005],cnt=0,bn,k,x,y;
long long b[25600005],ans=0;
bool d[25600005];
int copy(int x)
{
	a[++cnt]=a[x];
	b[cnt]=b[x];
	c[cnt]=c[x];
	d[cnt]=d[x];
	e[cnt]=(rand()<<15)+rand();
	l[cnt]=l[x];
	r[cnt]=r[x];
	return cnt;
}
void pushdown(int x)
{
	if (d[x])
	{
		if (l[x])
		{
			l[x]=copy(l[x]);
			swap(l[l[x]],r[l[x]]);
			d[l[x]]^=1;
		}
		if (r[x])
		{
			r[x]=copy(r[x]);
			swap(l[r[x]],r[r[x]]);
			d[r[x]]^=1;
		}
		d[x]=0;
	}
}
int merge(int x,int y)
{
	if (x && y)
	{
		if (e[x]<e[y])
		{
			pushdown(x);
			r[x]=merge(r[x],y);
			b[x]=a[x]+b[l[x]]+b[r[x]];
			c[x]=c[l[x]]+c[r[x]]+1;
			return x;
		}
		else
		{
			pushdown(y);
			l[y]=merge(x,l[y]);
			b[y]=a[y]+b[l[y]]+b[r[y]];
			c[y]=c[l[y]]+c[r[y]]+1;
			return y;
		}
	}
	else
	return x+y;
}
void split(int x,int &y,int &z,int k)
{
	if (x)
	{
		pushdown(x);
		x=copy(x);
		if (c[l[x]]<k)
		{
			y=x;
			split(r[x],r[x],z,k-c[l[x]]-1);
		}
		else
		{
			z=x;
			split(l[x],y,l[x],k);
		}
		b[x]=a[x]+b[l[x]]+b[r[x]];
		c[x]=c[l[x]]+c[r[x]]+1;
	}
	else
	{
		y=0;
		z=0;
	}
}
void insert(int old,int nw,int k,int num)
{
	int x,y=++cnt,z;
	a[cnt]=num;
	b[cnt]=num;
	c[cnt]=1;
	e[cnt]=(rand()<<15)+rand();
	split(root[old],x,z,k);
	root[nw]=merge(merge(x,y),z);
}
void erase(int old,int nw,int num)
{
	int x,y,z;
	split(root[old],x,z,num);
	split(x,x,y,num-1);
	if (y)
	y=merge(l[y],r[y]);
	root[nw]=merge(merge(x,y),z);
}
void modify(int old,int nw,int num1,int num2)
{
	int x,y,z;
	split(root[old],x,z,num2);
	split(x,x,y,num1-1);
	if (y)
	{
		swap(l[y],r[y]);
		d[y]^=1;
	}
	root[nw]=merge(merge(x,y),z);
}
long long query(int old,int nw,int num1,int num2)
{
	int x,y,z;
	split(root[old],x,z,num2);
	split(x,x,y,num1-1);
	long long result=b[y];
	root[nw]=merge(merge(x,y),z);
	return result;
}
int main()
{
	srand(time(nullptr));
	cin>>n;
	for (int i=1;i<=n;++i)
	{
		scanf("%d%d",&bn,&k);
		if (k==1)
		{
			scanf("%d%d",&x,&y);
			insert(bn,i,x^ans,y^ans);
		}
		else if (k==2)
		{
			scanf("%d",&x);
			erase(bn,i,x^ans);
		}
		else if (k==3)
		{
			scanf("%d%d",&x,&y);
			modify(bn,i,x^ans,y^ans);
		}
		else
		{
			scanf("%d%d",&x,&y);
			ans=query(bn,i,x^ans,y^ans);
			cout<<ans<<'\n';
		}
	}
}
2024/5/28 21:50
加载中...