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;
}
哈哈哈哈哈哈哈哈哈哈