代码
#include<bits/stdc++.h>
using namespace std;
int cnt=1;
struct node{
int left,right;
int value,num,size;
}t[100005];
void insert(int x,int root){
if(cnt==1){
node tmp{0,0,x,1,1}; t[cnt]=tmp;
cnt++;
}else{
if(x<t[root].value){
if(t[root].left==0){
node tmp{0,0,x,1,1}; t[cnt]=tmp; t[root].left=cnt;
cnt++;
}else insert(x,t[root].left);
}
if(x==t[root].value) t[root].num++;
if(x>t[root].value){
if(t[root].right==0){
node tmp{0,0,x,1,1}; t[cnt]=tmp; t[root].right=cnt;
cnt++;
}else insert(x,t[root].right);
}
}
t[root].size=t[t[root].left].size+t[t[root].right].size+t[root].num;
}
int query1(int x,int root){
if(root==0) return 1;
if(x<t[root].value) return query1(x,t[root].left);
if(x==t[root].value) return t[t[root].left].size+1;
if(x>t[root].value) return t[t[root].left].size+t[root].num+query1(x,t[root].right);
}
int query2(int x,int root){
if(x<=t[t[root].left].size) return query2(x,t[root].left);
if(x<=t[t[root].left].size+t[root].num) return t[root].value;
return query2(x-t[t[root].left].size-t[root].num,t[root].right);
}
int main(){
int n,op,x;
cin>>n;
for(int i=0;i<=n;i++){
cin>>op>>x;
if(op==1) cout<<query1(x,1)<<endl;
if(op==2) cout<<query2(x,1)<<endl;
if(op==3){
int tmp=query1(x,1);
if(tmp==1) cout<<-21474546778983647<<endl;
else cout<<query2(tmp-1,1)<<endl;
}
if(op==4){
int tmp=query1(x+1,1);
if(tmp==cnt) cout<<2147486456453647<<endl;
else cout<<query2(tmp,1)<<endl;
}
if(op==5) insert(x,1);
}
return 0;
}