RT,开O2会TLE,不开会MLE
#include<cstdio>
using namespace std;
struct node{int l,r,size,val;}tree[10001];
int q,n,d,x,y;
inline int readInt(){
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
inline int find(int x, int s){
if(tree[x].val==s)return tree[tree[x].l].size+1;
if(s<tree[x].val)return find(tree[x].l,s);
else return tree[tree[x].l].size+1+find(tree[x].r,s);
}
inline int lookup(int x, int k){
if(k<1||k>tree[x].size)return -1;
if(k==tree[tree[x].l].size+1)return tree[x].val;
if(k<=tree[tree[x].l].size)return lookup(tree[x].l,k);
else return lookup(tree[x].r,k-tree[tree[x].l].size-1);
}
inline int newnode(int s){
tree[++n].val=s;
tree[n].size=1;
return n;
}
inline void insert(int x,int s){
if(s<tree[x].val){
if(tree[x].l)insert(tree[x].l,s);
else tree[x].l=newnode(s);
}
else if(s>tree[x].val){
if(tree[x].r)insert(tree[x].r,s);
else tree[x].r=newnode(s);
}
tree[x].size=tree[tree[x].l].size+tree[tree[x].r].size+1;
}
int main(){
q=readInt();
while(q--){
d=readInt(),x=readInt();
switch(d){
case 1:printf("%d\n",find(1,x));break;
case 2:printf("%d\n",lookup(1,x));break;
case 3:printf("%d\n",lookup(1,find(1,x)-1));break;
case 4:printf("%d\n",lookup(1,find(1,x)+1));break;
case 5:if(!n)newnode(x);else insert(1, x);break;
}
}
return 0;
}