洛谷过不了编译,自己可以
#include<bits/stdc++.h>
using namespace std;
const int inf=2e9;
struct tree{
int l=-1,r=-1,w=-1;
int g=0,zg=0;
}a[1000005];
int cnt=2;
void it(){a[1].r=2,a[1].w=-inf,a[1].g=1,a[1].zg=2,a[2].zg=1,a[2].g=1,a[2].w=inf;}
int hj,qq,pa;
int see,ans_h;
int check_pos(int d,int x){
if(a[d].w<x){
if(see==1)a[d].zg-=ans_h;
else if(see==2)a[d].zg+=ans_h;
qq=max(qq,a[d].w),pa=d*10+1;
if(a[d].r==-1)return -d;
else return check_pos(a[d].r,x);
}else if(a[d].w>x){
if(see==1)a[d].zg-=ans_h;
else if(see==2)a[d].zg+=ans_h;
hj=min(hj,a[d].w),pa=d*10;
if(a[d].l==-1)return -d;
else return check_pos(a[d].l,x);
}else return d;
}
void push_in(int x){
cnt++,see=2,ans_h=1;
int n=check_pos(1,x);
if(n>0)a[n].g++,a[n].zg++;
else{
n=abs(n);
if(x>a[n].w)a[n].r=cnt,a[cnt].w=x,a[cnt].g=1,a[cnt].zg=1;
else a[n].l=cnt,a[cnt].w=x,a[cnt].g=1,a[cnt].zg=1;
}
}
int check_s(int d,int x){//x small
if(x>a[d].zg)return inf;
if(x<=a[a[d].l].zg)return check_s(a[d].l,x);
else if(x<=a[a[d].l].zg+a[d].g)return a[d].w;
else return check_s(a[d].r,x-a[a[d].l].zg-a[d].g);
}
int check_z(int d,int x){//where is x
if(d==-1)return 1;
if(x==a[d].w)return a[a[d].l].zg+1;
else if(x<a[d].w)return check_z(a[d].l,x);
else return check_z(a[d].r,x)+a[a[d].l].zg+a[d].g;
}
void dfs_tree(int d){
cout<<d<<' '<<a[d].w<<' '<<a[d].g<<' '<<a[d].zg<<' '<<a[a[d].l].w<<' '<<a[a[d].r].w<<"\n";
if(a[d].l!=-1)dfs_tree(a[d].l);
if(a[d].r!=-1)dfs_tree(a[d].r);
}
int check_h(int x){
see=2,ans_h=1;
int n=check_pos(1,x);
if(n<0||a[n].r==-1){
return hj;
}else{
n=a[n].r;
while(a[n].l!=-1)n=a[n].l;
ans_h=a[n].g;
return a[n].w;
}
}
int check_q(int x){
see=0;
int n=check_pos(1,x);
if(n<0||a[n].l==-1){
return qq;
}else{
n=a[n].l;
while(a[n].r!=-1)n=a[n].r;
return a[n].w;
}
}
bool kkk;
void pop_out(int x,int hh){
see=1,ans_h=hh;
int n=check_pos(1,x);
if(n<0){
see=2;
check_pos(1,x);
return ;
}else if(a[n].g==1||kkk){
if(a[n].l!=-1&&a[n].r==-1){
if(pa%10==1)a[pa/10].r=a[n].l;
else a[pa/10].l=a[n].l;
}else if(a[n].l==-1&&a[n].r==-1){
if(pa%10==1)a[pa/10].r=-1;
else a[pa/10].l=-1;
}else if(a[n].l==-1&&a[n].r!=-1){
if(pa%10==1)a[pa/10].r=a[n].r;
else a[pa/10].l=a[n].r;
}else{
int nn=check_h(x);
kkk=true;
pop_out(nn,ans_h);
kkk=false;
see=2,ans_h--;
check_pos(1,x);
a[n].w=nn;
a[n].g=ans_h+1;
a[n].zg+=ans_h;
}
}else a[n].g--,a[n].zg--;
}
int main(){
it();
int q;cin>>q;
while(q--){
hj=inf,qq=-inf;
int op,x;cin>>op>>x;
if(op==0){//out put tree
dfs_tree(1);
}else if(op==5){//push
push_in(x);
}else if(op==1){//where is x
int ans=check_z(1,x);
cout<<ans-1<<endl;
}else if(op==2){//x small
int ans=check_s(1,x+1);
if(ans==inf)cout<<"INF\n";
else cout<<ans<<endl;
}else if(op==4){//hj
int ans=check_h(x);
if(ans==inf)cout<<"2147483647\n";
else cout<<ans<<endl;
}else{//qq
int ans=check_q(x);
if(ans==-inf)cout<<"−2147483647\n";
else cout<<ans<<endl;
}
}
return 0;
}