#include<cstdio>
#include<cstdlib>
using namespace std;
struct node
{
int l,r,val,pri,cnt,size;
}a[100001];
int root=0,cnt;
void Update(int k)
{
a[k].size=a[a[k].l].size+a[a[k].r].size+a[k].cnt;
}
void Zig(int &k)
{
int y=a[k].l;
a[k].l=a[y].r;
a[y].r=k;
a[y].size=a[k].size;
Update(k);
k=y;
}
void Zag(int &k)
{
int y=a[k].r;
a[k].r=a[y].l;
a[y].l=k;
a[y].size=a[k].size;
Update(k);
k=y;
}
void Insert(int &k,int v)
{
if(!k)
{
k=++cnt;
a[k].l=a[k].r=0;
a[k].val=v;
a[k].pri=rand();
a[k].size=1;
a[k].cnt=1;
return;
}
a[k].size++;
if(v==a[k].val)
{
a[k].cnt++;
return;
}
if(v<a[k].val)
{
Insert(a[k].l,v);
if(a[a[k].l].pri<a[k].pri) Zig(k);
return;
}
if(v>a[k].val)
{
Insert(a[k].r,v);
if(a[a[k].r].pri<a[k].pri) Zag(k);
return;
}
}
void Delete(int &k,int v)
{
a[k].size--;
if(v==a[k].val)
{
if(a[k].cnt==1)
{
if(!a[k].l||!a[k].r) k=a[k].l+a[k].r;
else
{
if(a[a[k].l].pri<a[a[k].r].pri)
Zig(k),Delete(a[k].r,v);
else
Zag(k),Delete(a[k].l,v);
}
return;
}
}
if(v<a[k].val)
{
Delete(a[k].l,v);
return;
}
if(v>a[k].val)
{
Delete(a[k].r,v);
return;
}
}
int Query(int k,int v)
{
if(a[k].val<v) return a[k].size+a[a[k].l].size+Query(a[k].r,v);
if(a[k].val>v) return Query(a[k].l,v);
return a[a[k].l].size+1;
}
int Rank(int k,int x)
{
if(x>a[a[k].l].size&&x<=a[a[k].l].size+a[k].cnt) return a[k].val;
if(a[a[k].l].size>=x) return Rank(a[k].l,x);
return Rank(a[k].r,x-a[a[k].l].size-a[k].cnt);
}
int Prede(int k,int v)
{
if(!k) return 0;
if(a[k].val<v)
{
int tmp=Prede(a[k].r,v);
return tmp?tmp:a[k].val;
}
return Prede(a[k].l,v);
}
int Suc(int k,int v)
{
if(!k) return 0;
if(a[k].val>v)
{
int tmp=Suc(a[k].l,v);
return tmp?tmp:a[k].val;
}
return Prede(a[k].r,v);
}
int main()
{
int n,opt,x;
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:
Delete(root,x);
break;
case 3:
printf("%d\n",Query(root,x));
break;
case 4:
printf("%d\n",Rank(root,x));
break;
case 5:
printf("%d\n",Prede(root,x));
break;
case 6:
printf("%d\n",Suc(root,x));
break;
}
}
return 0;
}
两个猜想
1.有些变量没有赋初值
2.linux下rand函数输出爆int
明天就省选了,救救蒟蒻!