rt,提交记录 link,Code:
#include<iostream>
#include<queue>
#define INF 0x3f3f3f3f
#define ls s[0]
#define rs s[1]
#define tmp(a) t[t[a].fa].rs==a
#define tmp_ t[u].v<v
#define _tmp v<t[u].v
using namespace std;
namespace OIfast{
inline int read(){
register int n=0,f=1;
register char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
n=(n<<1)+(n<<3)+(c^48);
c=getchar();
}
return n*f;
}
inline void print(register int n){
if(n<0)n=~n+1,putchar('-');
if(n>=10)print(n/10);
putchar(n%10^48);
return ;
}
inline void write(register int n,register char c){
print(n),putchar(c);
return ;
}
}using namespace OIfast;
namespace splayTree{
const int N=1e6+5;
int root=0,tot=0;
struct node{
int fa,v,cnt,size;
int s[2];
}t[N];
inline void init(int x,int _v,int _fa){
t[x].cnt=t[x].size=1;
t[x].v=_v,t[x].fa=_fa;
return ;
}
inline void pushup(int x){
t[x].size=t[t[x].ls].size+t[t[x].rs].size+t[x].cnt;
return ;
}
inline void rotate(int x){
int y=t[x].fa;
int z=t[y].fa;
int k=tmp(x);
t[z].s[tmp(y)]=x,t[x].fa=z;
t[y].s[k]=t[x].s[k^1],t[t[x].s[k^1]].fa=y;
t[x].s[k^1]=y,t[y].fa=x;
pushup(y),pushup(x);
return ;
}
inline void splay(int x,int k){
while(t[x].fa!=k){
int y=t[x].fa;
int z=t[y].fa;
if(z!=k)rotate(((tmp(x))^(tmp(y)))?x:y);
rotate(x);
}
if(k==0)root=x;
return ;
}
inline void prepare(int v){
int u=root;
if(u==0)return ;
while(t[u].s[tmp_]!=0&&t[u].v!=v)u=t[u].s[tmp_];
splay(u,0);
return ;
}
inline void add(int v){
int u=root,f=0;
while(u!=0&&t[u].v!=v){
f=u;
u=t[u].s[tmp_];
}
if(u){
++t[u].cnt;
}else{
u=++tot;
init(u,v,f);
if(f!=0){
t[f].s[t[f].v<v]=u;
}
}
splay(u,0);
return ;
}
inline int get(int v,int f){
int u=root;
prepare(v);
if(_tmp&&f)return u;
if(tmp_&&(!f))return u;
if(t[u].s[f]!=0){
u=t[u].s[f];
while(t[u].s[f^1]!=0){
u=t[u].s[f^1];
}
}
return u;
}
inline void del(int v){
int a=get(v,0),b=get(v,1);
splay(a,0),splay(b,a);
if(t[t[b].ls].cnt>1){
--t[t[b].ls].cnt;
splay(t[b].ls,0);
}else{
t[b].ls=0;
}
return ;
}
inline int rk(int v){
prepare(v);
return t[t[root].ls].size;
}
inline int kth(int k){
int u=root;
if(t[u].size<k)return -1;
while(1){
if(k>t[t[u].ls].size+t[u].cnt){
k-=t[t[u].ls].size+t[u].cnt;
u=t[u].rs;
}else{
if(t[t[u].ls].size>=k)u=t[u].ls;
else return splay(u,0),t[u].v;
}
}
return 0;
}
}using namespace splayTree;
int n;
queue<int>ans;
inline void work(){
int opt=read(),x=read();
if(opt==0)return ;
else if(opt==1)add(x);
else if(opt==2)del(x);
else if(opt==3)add(x),ans.push(rk(x)),del(x);
else if(opt==4)ans.push(kth(x+1));
else if(opt==5)add(x),ans.push(t[get(x,0)].v),del(x);
else if(opt==6)add(x),ans.push(t[get(x,1)].v),del(x);
return ;
}
signed main(){
add(INF),add(-INF);
n=read();
while(n--)work();
while(!ans.empty())write(ans.front(),'\n'),ans.pop();
return 0;
}