求助 看了题解之后打的代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stdio.h>
using namespace std;
const int INF=0x7fffffff;
struct node{
int val;
int ls,rs;
int cnt;
int size;
};
//
int cont;
int n,opr,xx;
node tree[1000000000];
//-----------------------------函数-------------------------------------
void addval(int a,int v){
tree[a].size++;
if(tree[a].val==v){
tree[a].cnt++;
return ;
}
if(tree[a].val>v){//V in A's left tree.
if(tree[a].ls!=0){
addval(tree[a].ls,v);//
}
else{
cont++;
tree[cont].val=v;
tree[cont].size=tree[cont].cnt=1;
tree[a].ls=cont;
}
}else{//In right tree.
if(tree[a].rs!=0)
addval(tree[a].rs,v);
else{
cont++;
tree[cont].val=v;
tree[cont].size=tree[cont].cnt=1;
tree[a].rs=cont;
}
}
}
//--------------------
int findfront(int a,int val,int ans){
if(tree[a].val>val){//left.
if (tree[a].ls==0){//no tree.
return ans;
}else{//find left(next).
return findfront(tree[a].ls,val,ans);
}
}
else{//right.
if(tree[a].rs==0){
return (tree[a].val<val)?tree[a].val:ans;
}
if(tree[a].cnt!=0){
return findfront(tree[a].rs,val,tree[a].val);
}
else{
return findfront(tree[a].rs,val,ans);
}
}
}
//--------------------
int findback(int a,int val,int ans){
if(tree[a].val<val){
if (tree[a].rs==0){
return ans;
}else{
return findback(tree[a].rs,val,ans);
}
}
else{
if(tree[a].ls==0){
return (tree[a].val>val)?tree[a].val:ans;
}
if(tree[a].cnt!=0){
return findback(tree[a].ls,val,tree[a].val);
}
else{
return findback(tree[a].ls,val,ans);
}
}
}
//--------------------
int findval(int a,int val){
if(a==0){
return 0;
}
if(val==tree[a].val){
return tree[tree[a].ls].size;
}
if(val<tree[a].val){
return findval(tree[a].ls,val);
}
return findval(tree[a].rs,val)+tree[tree[a].ls].size+tree[a].cnt;
}
//--------------------
int findrank(int a,int val){
if(a==0){
return INF;
}
if(val==tree[a].val){
return tree[tree[a].ls].size;//left
}
if(val<tree[a].val){
return findrank(tree[a].ls,val);
}
return findrank(tree[a].rs,val)+tree[tree[a].ls].size+tree[a].cnt;
}
//---------------------------------------------------------------------
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
inline void write(int x){
char F[200];
int tmp=x>0?x:-x ;
if(x<0)putchar('-') ;
int cnt=0 ;
while(tmp>0){
F[cnt++]=tmp%10+'0';
tmp/=10;
}
while(cnt>0)putchar(F[--cnt]) ;
}
int main(){
n=read();
while(n--){
opr=read();xx=read();
if(opr==1){
printf("%d\n",findval(1,xx)+1);
}
else if(opr==2){
printf("%d\n",findrank(1,xx));
}
else if(opr==3){
printf("%d\n",findfront(1,xx,-INF));
}
else if(opr==4){
printf("%d\n",findback(1,xx,INF));
}
else{
if(cont==0){
cont++;
tree[cont].cnt=tree[cont].size=1;
tree[cont].val=xx;
}
else addval(1,xx);
}
}
return 0;
}