平衡树模板求调

删除写的有问题,没调出来,救救孩子吧

#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int tot,root;
bool flag;
int n,m;
struct node{
    int ch[2],fa;
    int h,bal,size;//树高和平衡因子
    int val;
}bst[N];
int newnode(int val,int fa){
    bst[++tot].val=val;bst[tot].fa=fa;
    bst[tot].h=1;//初始化树高
    bst[tot].bal=0; bst[tot].size=1;
    return tot;
}
/*
10 100
7 4 5 3 1 9 8 2 6 10
*/
int search_bst(int p,int val){
    if(p==0) return 0;
    if(bst[p].val==val){
        //cout<<"high: "<<bst[p].h<<endl;
        //cout<<"size: "<<bst[p].size<<endl;
        //cout<<"balance: "<<bst[p].bal<<endl;
        return p;
    }
    else if(val<bst[p].val) return search_bst(bst[p].ch[0],val);
    else return search_bst(bst[p].ch[1],val);
}
int Rank(int p,int x,int rk){
	if(p==0) return 114514;
	if(rk==x) return bst[p].val;
	else if(rk>x) return Rank(bst[p].ch[0],x,rk-bst[bst[bst[p].ch[0]].ch[1]].size-1);//递归左子树 
	else return Rank(bst[p].ch[1],x,rk+bst[bst[bst[p].ch[1]].ch[0]].size+1);//递归右子树 
} 
int x_rank(int p,int x,int rk){
	//cout<<"rk: "<<rk<<endl;

	if(bst[p].val==x){
		//cout<<"have val"<<endl;
		return rk;
	}
	else if(x<bst[p].val){//递归左子树' 
		if(bst[p].ch[0]==0) return rk;
		else return x_rank(bst[p].ch[0],x,rk-bst[bst[bst[p].ch[0]].ch[1]].size-1);
	}
	else{
		if(bst[p].ch[1]==0) return rk+1;
		else return x_rank(bst[p].ch[1],x,rk+bst[bst[bst[p].ch[1]].ch[0]].size+1);
	}
}
int x_front(int p,int x,int fr){
	if(p==0) return  fr;
	if(x<=bst[p].val) return x_front(bst[p].ch[0],x,fr);
	else return x_front(bst[p].ch[1],x,max(fr,bst[p].val));//比x小 
}
int x_back(int p,int x,int bk){
	if(p==0) return bk;
	if(x<bst[p].val) return x_back(bst[p].ch[0],x,min(bk,bst[p].val));//比x
	else return x_back(bst[p].ch[1],x,bk)	; 
}
int getfa(int p){
    return bst[bst[p].fa].ch[0]==p?0:1;
}
void update(int p){
    bst[p].h=max(bst[bst[p].ch[0]].h,bst[bst[p].ch[1]].h)+1;//更新树高
    bst[p].bal=bst[bst[p].ch[0]].h-bst[bst[p].ch[1]].h;//更新平衡因子
    bst[p].size=bst[bst[p].ch[0]].size+bst[bst[p].ch[1]].size+1;//更新子树大小
}
void rotate(int x){//以x为支点旋转他的父亲节点
    int s,y,z;
    y=bst[x].fa;s=getfa(x);z=bst[x].ch[s^1];//要旋转的节点和可能发生冲突的节点
    if(y==root) {
    	//cout<<"rotate root "<<endl;
		root=x;
	}
    else {bst[bst[y].fa].ch[getfa(y)]=x;bst[x].fa=bst[y].fa;}
    bst[y].ch[s]=z;bst[x].ch[s^1]=y;
    bst[y].fa=x;bst[z].fa=y;
    update(y);update(x);
}
void check(int p){//发生失衡 
	if(abs(bst[p].bal)>1){
    	//cout<<"No Balance "<<bst[p].val<<endl;
    	if(bst[p].bal==2&&bst[bst[p].ch[0]].bal==1){//LL	
			rotate(bst[p].ch[0]);
		}
		else if(bst[p].bal==-2&&bst[bst[p].ch[1]].bal==-1){//RR
			rotate(bst[p].ch[1]);
		}
		else if(bst[p].bal==2&&bst[bst[p].ch[0]].bal==-1){//LR
			rotate(bst[bst[p].ch[0]].ch[1]);
			rotate(bst[p].ch[0]);
		}
		else{//RL
			rotate(bst[bst[p].ch[1]].ch[0]);
			rotate(bst[p].ch[1]);
		}
	}
}
void insert_bst(int &p,int fa,int val){
    if(p==0){
        p=newnode(val,fa);//p是引用
        if(root==0) root=p;
        return;
    }
    if(bst[p].val==val) return;
    else if(val<bst[p].val) insert_bst(bst[p].ch[0],p,val);
    else insert_bst(bst[p].ch[1],p,val);
    update(p);
    check(p); 
	
}
void delete_bst(int &p,int val){
	//return ;
    if(p==0) return;
    if(bst[p].val==val){

        if(p==root) flag=1;
        if(bst[p].ch[0]==0&&bst[p].ch[1]==0) {p=0;}
        else if(bst[p].ch[0]==0) p=bst[p].ch[1];
        else if(bst[p].ch[1]==0) p=bst[p].ch[0];
        else{//有左右子树
        	//return ;
            int x=bst[p].ch[0];
            while(bst[x].ch[1]){//找到左子树最大
                x=bst[x].ch[1];
            }
            bst[p].val=bst[x].val;
            delete_bst(bst[p].ch[0],bst[x].val);
        }
        if(flag) {root=p;flag=0;}
    }
    else if(val<bst[p].val) delete_bst(bst[p].ch[0],val);
    else delete_bst(bst[p].ch[1],val);
    update(p);
    check(p);
	
}
int main(){
    cin>>m;
    while(m--){
        int op,x;
        cin>>op;
        if(op==1){//插入 
           cin>>x;
           insert_bst(root,root,x);
        }
        else if(op==2){//删除 
            cin>>x;
            //if(x==577793) continue;
            delete_bst(root,x);
        }
        else if(op==3){//x的排名 
        	cin>>x;
        	cout<<x_rank(root,x,bst[bst[root].ch[0]].size+1)<<endl;
		}
        else if(op==4){//排名为k 
            cin>>x;
            cout<<Rank(root,x,bst[bst[root].ch[0]].size+1)<<endl; 
        }
        else if(op==5){
        	cin>>x;
        	cout<<x_front(root,x,-INT_MAX)<<endl;
		}
		else{
			cin>>x;
			cout<<x_back(root,x,INT_MAX)<<endl;
		} 
    }
    //system("pause");
    return 0;
}

救一下,还没调好,呜呜呜