BST,参考题解区第一篇题解。
全WA
#include <iostream>
#include <climits>
using namespace std;
struct node{
int val,lc,rc,cnt,size;
}Tree[10010];
int q,cnt;
void Insert(int x,int val){
Tree[x].size++;
if(Tree[x].val==val){
Tree[x].cnt++;
return;
}
if(Tree[x].val>val){
if(Tree[x].lc)Insert(Tree[x].lc,val);
else{
Tree[x].lc=++cnt;
Tree[cnt].val=val;
Tree[cnt].size=Tree[cnt].cnt=1;
}
}else{
if(Tree[x].rc)Insert(Tree[x].rc,val);
else{
Tree[x].rc=++cnt;
Tree[cnt].val=val;
Tree[cnt].size=Tree[cnt].cnt=1;
}
}
}
int FindPrevious(int x,int val,int ans){
if(Tree[x].val>=val){
if(Tree[x].lc==0)return ans;
return FindPrevious(Tree[x].lc,val,ans);
}
if(Tree[x].rc==0)return Tree[x].val;
return FindPrevious(Tree[x].rc,val,Tree[x].val);
}
int FindNext(int x,int val,int ans){
if(Tree[x].val<=val){
if(Tree[x].rc==0)return ans;
return FindNext(Tree[x].rc,val,ans);
}
if(Tree[x].lc==0)return Tree[x].val;
return FindNext(Tree[x].lc,val,Tree[x].val);
}
int FindValue(int x,int rk){
if(x==0)return INT_MAX;
if(Tree[Tree[x].lc].size>=rk)return FindValue(Tree[x].lc,rk);
if(Tree[x].cnt+Tree[Tree[x].lc].size>=rk)return Tree[x].val;
return FindValue(Tree[x].rc,rk-Tree[x].cnt-Tree[Tree[x].lc].size);
}
int FindRank(int x,int val){
if(x==0)return 0;
if(Tree[x].val>val)return FindRank(Tree[x].lc,val);
if(Tree[x].val==val)return Tree[Tree[x].lc].size;
return FindRank(Tree[x].rc,val)+Tree[Tree[x].lc].size+Tree[x].cnt;
}
int main(){
cin>>q;
for(int i=1;i<=q;i++){
int op,val;
cin>>op>>val;
if(op==1)cout<<FindRank(1,val)+1<<endl;
if(op==2)cout<<FindValue(1,val)<<endl;
if(op==3)cout<<FindPrevious(1,val,INT_MIN)<<endl;
if(op==4)cout<<FindNext(1,val,INT_MAX)<<endl;
if(op==5){
if(cnt==0){
Tree[++cnt].cnt=Tree[cnt].size=1;
Tree[cnt].val=val;
}else Insert(1,val);
}
}
return 0;
}