#include<bits/stdc++.h>
#define ls x*2
#define rs x*2+1
#define mid (tree[x].l+tree[x].r)/2
#define fa (x+1)/2
using namespace std;
map<int,int>m;
int n,p,u[100005][2];
int q[100005];
struct node{
int l,r;
int num1,num2;
int mi,ma;
int tot;
}tree[300005];
int build(int x,int l,int r)
{
tree[x].l=l;tree[x].r=r;
if(l==r)
{
tree[x].num1=tree[x].num2=q[r];
return q[r];
}
tree[x].num1=build(x*2 ,l ,mid);
tree[x].num2=build(x*2+1,mid+1,r );
return tree[x].num2;
}
void ins(int k,int x)
{
tree[x].tot++;
if(tree[x].l==tree[x].r)
{
tree[x].mi=tree[x].ma=tree[x].num1;
return;
}
if(k>tree[x].num1)
{
ins(k,rs);
tree[x].ma=tree[rs].ma;
if(!tree[ls].tot)tree[x].mi=tree[rs].mi;
}
else
{
ins(k,ls);
tree[x].mi=tree[ls].mi;
if(!tree[rs].tot)tree[x].ma=tree[ls].ma;
}
return;
}
void del(int k,int x)
{
tree[x].tot--;
if(tree[x].l==tree[x].r)
{
if(!tree[x].tot)
tree[x].mi=tree[x].ma=0;
return;
}
if(k>tree[x].num1)
{
del(k,rs);
if(!tree[rs].tot)
{
tree[x].ma=tree[ls].ma;
tree[x].mi=tree[ls].mi;
}
}
else
{
del(k,ls);
if(!tree[ls].tot)
{
tree[x].ma=tree[rs].ma;
tree[x].mi=tree[rs].mi;
}
}
return;
}
int rk(int k,int x)
{
if(tree[x].l==tree[x].r)return 0;
if(k>tree[x].num1)return rk(k,rs)+tree[ls].tot;
else return rk(k,ls);
}
int kth(int k,int x)
{
if(tree[x].l==tree[x].r)return tree[x].num1;
if(k<=tree[ls].tot)return kth(k,ls);
else return kth(k-tree[ls].tot,rs);
}
int pre(int k,int x)
{
//cout<<tree[x].ma<<" "<<tree[x].mi<<" "<<x<<endl;
if(tree[x].l==tree[x].r)return tree[x].num1;
if((!tree[rs].tot)||k<=tree[rs].mi)return pre(k,ls);
else return pre(k,rs);
}
int nxt(int k,int x)
{
if(tree[x].l==tree[x].r)return tree[x].num1;
if((!tree[ls].tot)||k>=tree[ls].ma)return nxt(k,rs);
else return nxt(k,ls);
}
int main()
{
cin>>n;
for(register int i=1;i<=n;++i)
{
scanf("%d%d",&u[i][1],&u[i][2]);
if(u[i][1]==1)
{
if(!m[u[i][2]])q[++p]=u[i][2],m[u[i][2]]=1;
}
}
sort(q+1,q+p+1);
build(1,1,p);
//for(int i=1;i<=3;++i)cout<<tree[i].ma<<" "<<tree[i].mi<<endl;
for(register int i=1;i<=n;++i)
{
switch(u[i][1])
{
case 1:ins(u[i][2],1);break;
case 2:del(u[i][2],1);break;
case 3:printf("%d\n",rk(u[i][2],1)+1);break;
case 4:printf("%d\n",kth(u[i][2],1));break;
case 5:printf("%d\n",pre(u[i][2],1));break;
case 6:printf("%d\n",nxt(u[i][2],1));break;
}
}
//for(int i=1;i<=3;++i)cout<<tree[i].ma<<" "<<tree[i].mi<<endl;
/*for(int i=1;i<=5;++i)
printf("%d %d %d %d %d\n",tree[i].l,tree[i].r,tree[i].num1,tree[i].num2,tree[i].tot);*/
return 0;
}
目前52分 都是WA
P3369