Treap 模板

#include<cstdio>
#include<cstring>
#include<cstdlib>
#define N 100010
using namespace std;
int len=0,root=1;
struct
{
	int v,s,l,r,si;
}a[N];
void update (int x)
{
	a[x].si=a[a[x].l].si+a[a[x].r].si+1;
}
void split(int rt,int &x,int &y,int key)
{
	if(!rt) x=y=0;
	else
	{
		if(a[rt].v<=key)	 
		{
			x=rt;
			split(a[rt].r,a[x].r,y,key);
		}
		else
		{
			y=rt;
			split(a[rt].l,x,a[y].l,key);
		}
		update(rt);
	}
}
void merge(int &rt,int x,int y)
{
	if(x==0) rt=y; 
	else if(y==0) rt=x;
	else
	{
		if(a[x].s<a[y].s)
		{
			rt=x;
			merge(a[rt].r,a[x].r,y);
		}
		else 
		{
			rt=y;
			merge(a[rt].l,x,a[y].l);
		}
		update(rt);
	}
}
int add(int v)
{
	a[len].l=a[++len].r=0;
	a[len].v=v;
	a[len].s=rand()*rand();
	a[len].si=1;
	return len;
}
int get(int rt,int v)
{
	while(a[a[rt].l].si+1!=v)
	{
		if(a[a[rt].l].si+1<v)
		{
			v-=a[a[rt].l].si+1;
			rt=a[rt].r;
		}
		else rt=a[rt].l;
	}
	return a[rt].v;
}
int main()
{
	int n,i,op,v;
	scanf("%d",&n);
	add(1e+9);
	a[1].si=0;
	for(i=1;i<=n;i++)
	{
		scanf("%d%d",&op,&v);
		if(op==1)
		{
			int x=0,y=0,k=add(v);
			split(root,x,y,v);
			merge(x,x,k);
			merge(root,x,y);
		}
		else if(op==2)
		{
			int x=0,y=0,z=0;
			split(root,x,y,v);
			split(x,x,z,v-1);
			merge(z,a[z].l,a[z].r);
			merge(x,x,z);
			merge(root,x,y);
		}
		else if(op==3)
		{
			int x=0,y=0;
			split(root,x,y,v-1);
			printf("%d\n",a[x].si+1);
			merge(root,x,y);
		}
		else if(op==4)
		{
			printf("%d\n",get(root,v));
		}
		else if(op==5)
		{
			int x=0,y=0;
			split(root,x,y,v-1);
			printf("%d\n",get(x,a[x].si));
			merge(root,x,y);
		}
		else 
		{
			int x=0,y=0;
			split(root,x,y,v);
			printf("%d\n",get(y,1));
			merge(root,x,y);
		}
	}
	return 0;
}
posted @ 2021-04-06 09:50  AnAn_119  阅读(34)  评论(0编辑  收藏  举报