56求救
查看原帖
56求救
276928
Falsecx楼主2023/12/22 17:03
#include<bits/stdc++.h>
using namespace std;
#define MAXN 2100004
#define get(a) a=getint()
int getint()
{
	int sign=1,s=0;
	char ch=getchar();
	while(!(isdigit(ch)||ch=='-'))ch=getchar();
	if(ch=='-')
	{
		sign=-1;
		ch=getchar();
	}
	while(isdigit(ch))
	{
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*sign;
}
const int INF=INT_MAX;
struct fhq_treap
{

	int root,tot,ch[MAXN][2],siz[MAXN],val[MAXN],dat[MAXN];
	int New(int value)
	{
		++tot;
		siz[tot]=1;
		val[tot]=value;
		dat[tot]=rand();
		return tot;
	}
	fhq_treap()
	{
		New(INF);
		New(-INF);
		ch[1][0]=2;
		root=1;
	}
	void update(int o)
	{
		siz[o]=siz[ch[o][0]]+siz[ch[o][1]]+1;
	}
	void split(int &x,int &y,int now,int k)
	{
		if(!now)x=y=0;
		else
		{ 
			if(val[now]<=k)
				x=now,split(ch[now][1],y,ch[now][1],k);
			else y=now,split(x,ch[now][0],ch[now][0],k);
			update(now);
		}
	}
	int merge(int x,int y)
	{
		if(!x)return y;
		if(!y)return x;
		if(dat[x]<dat[y])
		{
			ch[x][1]=merge(ch[x][1],y);
			update(x);
			return x;
		}
		else 
		{
			ch[y][0]=merge(x,ch[y][0]);
			update(y);
			return y;
		}
	}
	void insert(int o)
	{
		int t=New(o),x,y;
		split(x,y,root,o);
		root=merge(merge(x,t),y);
	}
	void del(int o)
	{
		int x,y,z;
		split(x,y,root,o);
		split(x,z,x,o-1);
		z=merge(ch[z][0],ch[z][1]);
		root=merge(merge(x,z),y);
	}
	int rank(int o)
	{
		int x,y;
		split(x,y,root,o-1);
		int t=siz[x]+1;
		root=merge(x,y);
		return t;
	}
	int kth(int now,int k)
	{
		while(1)
		{
			if(k<=siz[ch[now][0]])now=ch[now][0];
			else if(k==siz[ch[now][0]]+1)
				return val[now];
			else k-=siz[ch[now][0]]+1,now=ch[now][1];
		}
	}
	int pre(int o)
	{
		int x,y,t;
		split(x,y,root,o-1);
		t=kth(x,siz[x]);
		root=merge(x,y);
		return t;
	}
	int next(int o)
	{
		int x,y,t;
		split(x,y,root,o);
		t=kth(y,1);
		root=merge(x,y);
		return t;
	}
	void dfs(int now)
	{
		if(now==0)return;
		dfs(ch[now][0]);
		printf("#%d",val[now]);
		dfs(ch[now][1]);
	}
	void test()
	{
		dfs(root);
	}
}tree;
int n,last,m,ans;
int main()
{
	srand(time(0));
	get(n);get(m);
	for(int i=1;i<=n;++i)
	{
		int p=getint();
		tree.insert(p);
	}
	for(int i=1;i<=m;++i)
	{
		int opt=getint(),o=getint();
		if(opt==1)
			tree.insert(o);
		else if(opt==2)tree.del(o);
		else if(opt==3){o^=last,last=tree.rank(o)-1,ans^=last;}
		else if(opt==4){o^=last,last=tree.kth(tree.root,o+1),ans^=last;}
		else if(opt==5){o^=last,last=tree.pre(o),ans^=last;}
		else{o^=last,last=tree.next(o),ans^=last;}
//		tree.test();
	}
	printf("%d",ans);
    return 0;
}
2023/12/22 17:03
加载中...