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;
}
标签:ch,return,int,pri,tot,treap,fhq,size 来源: https://www.cnblogs.com/cbdsopa/p/15930228.html