很高兴(能在有生之年)a掉treap
代码调试太稳了,改了一个地方就A了
没有什么调试的痕迹
上代码@!!
AC Code
#include<cstdio>
#include<iostream>
#define N 100005
using namespace std;
struct Treap
{
int l,r,key,size,w,rnd;
}T[N*2];
int root,n,siz,opt,ans,x;
inline void update(int k)
{
T[k].size=T[T[k].l].size+T[T[k].r].size+T[k].w;
}
inline void zig(int &k)
{
int t=T[k].r;
T[k].r=T[t].l;
T[t].l=k;
T[t].size=T[k].size;
update(k);
k=t;
}
inline void zag(int &k)
{
int t=T[k].l;
T[k].l=T[t].r;
T[t].r=k;
T[t].size=T[k].size;
update(k);
k=t;
}
inline int rand()
{
int seed=7;
return seed=(int)seed*1ll*48271%2147483647;
}
void insert(int &k,int x)
{
if(!k)
{
siz++;
k=siz;
T[k].size=T[k].w=1;
T[k].rnd=rand();
T[k].key=x;
return ;
}
T[k].size++;
if(x==T[k].key)T[k].w++;
else if(x>T[k].key)
{
insert(T[k].r,x);
if(T[T[k].r].rnd<T[k].rnd)zig(k);
}
else
{
insert(T[k].l,x);
if(T[T[k].l].rnd<T[k].rnd)zag(k);
}
}
void del(int &k,int x)
{
if(!k) return ;
if(x==T[k].key)
{
if(T[k].w>1)
{
T[k].w--;
T[k].size--;
return ;
}
if(T[k].l==0||T[k].r==0)k=T[k].l+T[k].r;
else if(T[T[k].l].rnd<T[T[k].r].rnd)zag(k),del(k,x);
else zig(k),del(k,x);
}
else if(x>T[k].key)T[k].size--,del(T[k].r,x);
else T[k].size--,del(T[k].l,x);
}
int get_num(int k,int x)
{
if(!k)return 0;
if(x==T[k].key)
{
return T[T[k].l].size+1;
}
if(x<T[k].key)return get_num(T[k].l,x);
return T[T[k].l].size+T[k].w+get_num(T[k].r,x);
}
void query_pro(int k,int x)
{
if(!k)return ;
if(x>T[k].key)
{
ans=T[k].key;
query_pro(T[k].r,x);
}
else query_pro(T[k].l,x);
}
void query_sub(int k,int x)
{
if(!k)return ;
if(x<T[k].key)
{
ans=T[k].key;
query_sub(T[k].l,x);
}
else query_sub(T[k].r,x);
}
int K_th(int k,int x)
{
if(!k)return 0;
if(x<=T[T[k].l].size)return K_th(T[k].l,x);
if(x>T[k].w+T[T[k].l].size)return K_th(T[k].r,x-T[T[k].l].size-T[k].w);
return T[k].key;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&opt,&x);
switch(opt)
{
case 1:insert(root,x);break;
case 2:del(root,x);break;
case 3:printf("%d\n",get_num(root,x));break;
case 4:printf("%d\n",K_th(root,x));break;
case 5:query_pro(root,x);printf("%d\n",ans);break;
case 6:query_sub(root,x);printf("%d\n",ans);break;
}
}
return 0;
}