求助
#include<bits/stdc++.h>
using namespace std;
const int N=1000005,INF=0x3f3f3f3f;
int n,size[N],l[N],r[N],ct[N],v[N],rnd[N],sz,ss;
int rand(){
int seed=12345;
return seed=(int)seed*482711LL%2147483647;
}
void update(int p){
size[p]=size[l[p]]+size[r[p]]+ct[p];
return;
}
void rturn(int &k){
int t=l[k];
l[k]=r[t];
r[t]=k;
size[t]=size[k];
update(k);
k=t;
return;
}
void lturn(int &k){
int t=r[k];
r[k]=l[t];
l[t]=k;
size[t]=size[k];
update(k);
k=t;
return;
}
void ins(int &p,int x){
if(p==0){
p=++sz;
size[p]=1;
ct[p]=1;
v[p]=x;
rnd[p]=rand();
return;
}
size[p]++;
if(v[p]==x)
ct[p]++;
else if(x>v[p]){
ins(r[p],x);
if(rnd[r[p]]<rnd[p])
lturn(p);
}
else{
ins(l[p],x);
if(rnd[l[p]]<rnd[p])
rturn(p);
}
return;
}
void del(int &p,int x){
if(p==0)
return;
if(v[p]==x)
if(ct[p]>1){
ct[p]--;
size[p]--;
}
else{
if(l[p]==0||r[p]==0)
p=l[p]+r[p];
else if(rnd[l[p]]<rnd[r[p]]){
rturn(p);
del(p,x);
}
else{
lturn(p);
del(p,x);
}
}
else if(x>v[p]){
size[p]--;
del(r[p],x);
}
else{
size[p]--;
del(l[p],x);
}
return;
}
int query1(int p,int x){
if(p==0)
return 0;
if(v[p]==x)
return size[l[p]]+1;
else if(x>v[p])
return size[l[p]]+ct[p]+query1(r[p],x);
else
return query1(l[p],x);
}
int query2(int p,int x){
if(p==0)
return 0;
if(x<=size[l[p]])
return query2(l[p],x);
x-=size[l[p]];
if(x<=ct[p])
return v[p];
x-=ct[p];
return query2(r[p],x);
}
int findfront(int p,int x){
if(p==0)
return -INF;
if(v[p]<x)
return max(v[p],findfront(r[p],x));
return findfront(l[p],x);
}
int findback(int p,int x){
if(p==0)
return INF;
if(v[p]<=x)
return findback(r[p],x);
return min(v[p],findback(l[p],x));
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int flag,x;
scanf("%d%d",&flag,&x);
if(flag==1)
ins(ss,x);
if(flag==2)
del(ss,x);
if(flag==3)
printf("%d\n",query1(ss,x));
if(flag==4)
printf("%d\n",query2(ss,x));
if(flag==5)
printf("%d\n",findfront(ss,x));
if(flag==6)
printf("%d\n",findback(ss,x));
}
return 0;
}