神一样的可持久化Treap模板

 第一次发现指针这么好用

#include<cstdio>

#include<cstring>
#include<algorithm>
#include<ctime>
using namespace std;
#define maxn 100007
#define rep(i,x,y) for(int i=x;i<=y;++i)
struct Treap
{
Treap *l,*r;
int fix,key,size;
  Treap(int key ):fix(rand()),key(key ),l(NULL),r(NULL),size(1){}//
inline void updata()
{
size=1+(l?l->size:0)+(r?r->size:0);//
}*root;
typedef pair<Treap*,Treap*>Droot;
inline int Size(Treap *x){return x?x->size:0;}//
Treap *merge(Treap *A,Treap *B)
{
if(!A){return B;}
if(!B){return A;}
if(A->fix<B->fix)
{
A->r=merge(A->r,B);
A->updata();
return A;
}
else
{
B->l=(A,B->l);
B->updata();
return B;
}
}
Droot split(Treap *x,int k)
{
if(!x)return Droot(NULL,NULL);
Droot y;  
if(Size(x->l)>=k)//
{
y=split(x->l,k);
x->l=y.second;
x->updata();//
y.second=x;
}
else
{
y=split(x->r,k-Size(x->l)-1);
x->r=y.first;
x->updata();//
y.first=x;
}
return y;
}
Treap *build(int *a)
{
static Treap *stack[maxn],*x,*last;
int p=0;
rep(i,0,a[0])
{
x=new Treap(a[i]);//
last=NULL;
while(p&&stack[p]->fix>x->fix)//
{
stack[p]->updata();//
last=stack[p];//
stack[p--]=0;//
}
if(p)stack[p]->r=x;//
x->l=last;
stack[++p]=x;//
}
while(p)stack[p--]->updata();
return stack[1];
}
int findkth(int k)
{
Droot x=split(root,k-1);
Droot y=split(x.second,1);
Treap *ans=y.first;
root=merge(merge(x.first,ans),y.second);
return ans->key;
}
inline int getkth(Treap *x,int v)
{
if(!x)return 0;
return v<x->key?getkth(x->l,v):getkth(x->r,v)+Size(x->l)+1;
}
inline void insert(int v)
{
int k=getkth(root,v);
Droot x=split(root,k);//
Treap *n=new Treap(v);
root=merge(merge(x.first,n),x.second);
}
inline void Delete(int k)
{
Droot x=split(root,k-1);
Droot y=split(x.second,1);
root=merge(x.first,y.second);
}
int a[maxn],M,x;
int main()
{
scanf("%d",a);
rep(i,1,a[0])scanf("%d",a+i);
sort(a+1,a+1+a[0]);
root=build(a);//
scanf("%d",&M);
while(M--)
{
char ch=getchar();
while(ch!='Q'&&ch!='A'&&ch!='D') ch=getchar();
scanf("%d",&x);
if(ch=='Q') printf("%d\n",findkth(x));
if(ch=='A') insert(x);
if(ch=='D') Delete(x);
}
}
posted @ 2017-04-17 16:25  OcahIBye  阅读(199)  评论(0编辑  收藏  举报