fhq treap

#include<bits/stdc++.h>
using namespace std;
int n,m,tot;
struct treap
{
	int ch[3],pri,size,v;
}t[100010];
void update(int x)
{
	t[x].size=1+t[t[x].ch[0]].size+t[t[x].ch[1]].size; 
}
int new_node(int x)
{
	t[++tot].v=x;
	t[tot].size=1;
	t[tot].pri=rand();
	return tot;
}
int merge(int x,int y)
{
	if(!x||!y) return x+y;
	if(t[x].pri<t[y].pri)
	{
		t[x].ch[1]=merge(t[x].ch[1],y);
		update(x);
		return x;
	}
	else 
	{
		t[y].ch[0]=merge(x,t[y].ch[0]);
		update(y);
		return y;
	}
}
void split(int x,int k,int &a,int &b)
{
	if(!x) a=b=0;
	else
	{
		if(t[x].v<=k) 
		{
			a=x;
			split(t[x].ch[1],k,t[x].ch[1],b);
		}
		else
		{
			b=x;
			split(t[x].ch[0],k,a,t[x].ch[0]);
		}
		update(x);
	}
}
int kth(int x,int k)
{
	while(1)
	{
		if(k<=t[t[x].ch[0]].size)
		{
			x=t[x].ch[0];
		}
		else if(k==t[t[x].ch[0]].size+1) return x;
		else k-=t[t[x].ch[0]].size+1,x=t[x].ch[1];
	}
}
int main()
{
	srand(time(NULL));
	scanf("%d",&n);
	int root=0;
	while(n--)
	{
		int c,a,x,y,z;
		scanf("%d%d",&c,&a);
		if(c==1)
		{
			split(root,a,x,y);
			root=merge(merge(x,new_node(a)),y);
		}
		if(c==2)
		{
			split(root,a,x,z);
			split(x,a-1,x,y);
			y=merge(t[y].ch[0],t[y].ch[1]);
			root=merge(merge(x,y),z);
		}
		if(c==3)
		{
			split(root,a-1,x,y);
			printf("%d\n",t[x].size+1);
			root=merge(x,y);
		}
		if(c==4)
		{
			printf("%d\n",t[kth(root,a)].v);
		}
		if(c==5)
		{
			split(root,a-1,x,y);
			printf("%d\n",t[kth(x,t[x].size)].v);
			root=merge(x,y);
		}
		if(c==6)
		{
			split(root,a,x,y);
			printf("%d\n",t[kth(y,1)].v);
			root=merge(x,y);
		}
	}
	return 0;
}


上一篇:Powerful Number 筛法


下一篇:1688. 比赛中的配对次数 模拟&直接观察规律