treap模板。。。没啥好说的啊。。。
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int m,sz,root,tmp;
struct Tree
{
int l,r;
int num,rnd,w,s;
}tree[400005];
void update(int t)
{
tree[t].s=tree[tree[t].l].s+tree[tree[t].r].s+tree[t].w;
}
void lturn(int &t)
{
int k=tree[t].r;
tree[t].r=tree[k].l;
tree[k].l=t;
tree[k].s=tree[t].s;
update(t);
t=k;
}
void rturn(int &t)
{
int k=tree[t].l;
tree[t].l=tree[k].r;
tree[k].r=t;
tree[k].s=tree[t].s;
update(t);
t=k;
}
void insert(int &w,int x)
{
if(!w)
{
w=++sz;
tree[w].rnd=rand();
tree[w].num=x;
tree[w].w=1;
tree[w].s=1;
return;
}
tree[w].s++;
if(tree[w].num==x)
{
tree[w].w++;
return;
}
if(tree[w].num<x)
{
insert(tree[w].r,x);
if(tree[tree[w].r].rnd<tree[w].rnd) lturn(w);
}
else if(tree[w].num>x)
{
insert(tree[w].l,x);
if(tree[tree[w].l].rnd<tree[w].rnd) rturn(w);
}
}
void del(int &w,int x)
{
if(x==tree[w].num)
{
if(tree[w].w>1)
{
tree[w].w--;
tree[w].s--;
return;
}
if(tree[w].l*tree[w].r==0) w=tree[w].l+tree[w].r;
else if(tree[tree[w].l].rnd<tree[tree[w].r].rnd)
{
rturn(w);
del(w,x);
}
else
{
lturn(w);
del(w,x);
}
}
else if(x<tree[w].num)
{
del(tree[w].l,x);
tree[w].s--;
}
else
{
del(tree[w].r,x);
tree[w].s--;
}
}
void query_rank(int w,int x)
{
if(!w) return;
if(x==tree[w].num)
{
tmp+=tree[tree[w].l].s;
return;
}
else if(x<tree[w].num) query_rank(tree[w].l,x);
else
{
tmp+=tree[tree[w].l].s+tree[w].w;
query_rank(tree[w].r,x);
}
}
void query_val(int w,int x)
{
if(tree[tree[w].l].s<x && x<=tree[tree[w].l].s+tree[w].w)
printf("%d\n",tree[w].num);
else if(x<=tree[tree[w].l].s) query_val(tree[w].l,x);
else query_val(tree[w].r,x-tree[w].w-tree[tree[w].l].s);
}
void before(int w,int x)
{
if(!w) return;
if(tree[w].num<x)
{
tmp=max(tmp,tree[w].num);
before(tree[w].r,x);
}
else before(tree[w].l,x);
}
void after(int w,int x)
{
if(!w) return;
if(tree[w].num>x)
{
tmp=min(tmp,tree[w].num);
after(tree[w].l,x);
}
else after(tree[w].r,x);
}
int main()
{
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
int op,k;
scanf("%d",&op);
if(op==1)
{
scanf("%d",&k);
insert(root,k);
}
if(op==2)
{
scanf("%d",&k);
del(root,k);
}
if(op==3)
{
tmp=1;
scanf("%d",&k);
query_rank(root,k);
printf("%d\n",tmp);
}
if(op==4)
{
scanf("%d",&k);
query_val(root,k);
}
if(op==5)
{
tmp=0;
scanf("%d",&k);
before(root,k);
printf("%d\n",tmp);
}
if(op==6)
{
tmp=9999999;
scanf("%d",&k);
after(root,k);
printf("%d\n",tmp);
}
}
return 0;
}