错误:#1--#2 WA
Code:
#include <bits/stdc++.h>
using namespace std;
int n,opt,x;
struct Treap_Node
{
int ls,rs;
int k,w;
int cnt;
int size;
} Treap[100005];
int root,Treap_size;
int New(int val)
{
Treap_size++;
Treap[Treap_size].k=val;
Treap[Treap_size].w=rand();
Treap[Treap_size].cnt=Treap[Treap_size].size=1;
Treap[Treap_size].ls=Treap[Treap_size].rs=0;
return Treap_size;
}
void update(int &rt)
{
Treap[rt].size=Treap[Treap[rt].ls].size+Treap[Treap[rt].rs].size+Treap[rt].cnt;
}
void build()
{
root=New(-INT_MAX);
Treap[1].rs=New(INT_MAX);;
update(root);
}
void lrotate(int &rt)
{
int r=Treap[rt].rs;
Treap[rt].rs=Treap[r].ls;
Treap[r].ls=rt;
Treap[r].size=Treap[rt].size;
update(rt);
rt=r;
}
void rrotate(int &rt)
{
int l=Treap[rt].ls;
Treap[rt].ls=Treap[l].rs;
Treap[l].rs=rt;
Treap[l].size=Treap[rt].size;
update(rt);
rt=l;
}
void insert(int &rt,int val)
{
if (rt==0)
{
rt=New(val);
return;
}
Treap[rt].size++;
if (Treap[rt].k==val)
{
Treap[rt].cnt++;
return;
}
else
{
if (Treap[rt].k>val)
{
insert(Treap[rt].ls,val);
if (Treap[rt].w<Treap[Treap[rt].ls].w)
{
rrotate(rt);
}
}
else
{
insert(Treap[rt].rs,val);
if (Treap[rt].w<Treap[Treap[rt].rs].w)
{
lrotate(rt);
}
}
}
}
void del(int &rt,int val)
{
if (rt==0) return;
Treap[rt].size--;
if (Treap[rt].k==val)
{
if (Treap[rt].cnt>1)
{
Treap[rt].cnt--;
return;
}
if (Treap[rt].ls==0 || Treap[rt].rs==0)
rt=Treap[rt].ls+Treap[rt].rs;
else
{
if (Treap[Treap[rt].ls].w>Treap[Treap[rt].rs].w)
{
rrotate(rt);
del(Treap[rt].rs,val);
}
else
{
lrotate(rt);
del(Treap[rt].ls,val);
}
}
return;
}
if (Treap[rt].k>val) del(Treap[rt].ls,val);
else del(Treap[rt].rs,val);
}
int getrank(int rt,int val)
{
if (rt==0) return 0;
if (Treap[rt].k==val) return Treap[Treap[rt].ls].size;
else if (Treap[rt].k>val) return getrank(Treap[rt].ls,val);
return Treap[Treap[rt].ls].size+Treap[rt].cnt+getrank(Treap[rt].rs,val);
}
int getranx(int rt,int ranx)
{
if (rt==0) return INT_MAX;
if (Treap[Treap[rt].ls].size>=ranx)
return getranx(Treap[rt].ls,ranx);
else if (Treap[Treap[rt].ls].size+Treap[rt].cnt>=ranx)
return Treap[rt].k;
return getranx(Treap[rt].rs,ranx-Treap[Treap[rt].ls].size-Treap[rt].cnt);
}
int getpre(int val)
{
int pre=-1;
int rt=root;
while (rt)
{
if (Treap[rt].k<val)
{
pre=Treap[rt].k;
rt=Treap[rt].rs;
}
else rt=Treap[rt].ls;
}
return pre;
}
int getnext(int val)
{
int next=-1;
int rt=root;
while (rt)
{
if (Treap[rt].k>val)
{
next=Treap[rt].k;
rt=Treap[rt].ls;
}
else rt=Treap[rt].rs;
}
return next;
}
int main()
{
srand(time(0));
build();
scanf("%d",&n);
while (n--)
{
scanf("%d %d",&opt,&x);
if (opt==1) insert(root,x);
else if (opt==2) del(root,x);
else if (opt==3) printf("%d\n",getrank(root,x)-1);
else if (opt==4) printf("%d\n",getranx(root,x+1));
else if (opt==5) printf("%d\n",getpre(x));
else if (opt==6) printf("%d\n",getnext(x));
}
return 0;
}