G
N
I
D
A
O
L

二叉搜索树


#include<bits/stdc++.h>
using namespace std; 

struct findt{
	int root=1;
	int ottoma=0;
	struct point{
		int count;
		int num;
		int fa;
		int le;
		int ri;
		int otto;
		int sizel;
		int sizer;
	};
	point p[1145104];
	int creat(int num){
		int id=p[root].sizel+p[root].sizer+(p[root].count&&1)+ottoma+1;
		p[id].count=1;
		p[id].num=num;
		p[id].otto=1;
//		cout<<"cout a point on "<<id<<endl;
	//	out(1);
		return id; 
	}
	int insert(int num,int id){
//		cout<<"ins "<<id<<endl;
		if(!p[id].otto){
			return creat(num);
		}
		if(p[id].num==num){
			p[id].count++;
			return id;
		}
		if(p[id].num<num){
			p[id].ri=insert(num,p[id].ri); 
			p[p[id].ri].fa=id;
			p[id].sizer++;
			return id;
		}
		if(p[id].num>num){
			p[id].le=insert(num,p[id].le); 
			p[p[id].le].fa=id;
			p[id].sizel++;
			return id;
		}
		return id;
	}
	int search_t(int ser,int id){
//		cout<<ser<<" t "<<id<<endl;
		if(ser>p[id].sizel&&ser<=p[id].sizel+p[id].count){
			return p[id].num;
		}
		if(ser<=p[id].sizel){
			return search_t(ser,p[id].le);
		}else{
			return search_t(ser-p[id].sizel-p[id].count,p[id].ri);
		}
	} 
	int search_v(int ser,int id){
//		cout<<ser<<" v "<<id<<endl;
		if(ser==p[id].num){
			return p[id].sizel+1;
		}
		if(ser<p[id].num){
			return search_v(ser,p[id].le);
		}else{
			return search_v(ser,p[id].ri)+p[id].sizel+p[id].count;
		}
	}
	int sercot(int ser,int id){
	//	cout<<ser<<" o "<<id<<endl;
		if(ser==p[id].num){
			
			return p[id].count;
		}
		if(ser<p[id].num){
			return sercot(ser,p[id].le);
		}else{
			return sercot(ser,p[id].ri);
		}
	} 
	void del(int ser,int id){
	//	cout<<ser<<" "<<id<<endl;
		if(ser==p[id].num){
			p[id].count--;
		}
		else if(ser<p[id].num){
			del(ser,p[id].le);
			p[id].sizel--;
		}else{
			del(ser,p[id].ri);
			p[id].sizer--;
		}
		if(p[id].count==0){
			ottoma++;
		}
		return ;
	} 
	int pon(int num,int id){
		insert(num,id); 
	//	out(root);
		//cout<<search_v(num,id);
		int x= search_t(search_v(num,id)+sercot(num,id),root); 
		del(num,id);
		return x;
	}
	int ton(int num,int id){
		insert(num,id); 
		int x= search_t(search_v(num,id)-1,root); 
		del(num,id);
		return x;
	}
	void out(int id){
		if(p[id].le)
		out(p[id].le);
		cout<<" ("<<id<<" "<<p[id].num<<" "<<p[id].count<<"  /"<<p[id].le<<" "<<p[id].sizel<<" \\"<<p[id].ri<<" "<<p[id].sizer<<") ";
		if(p[id].ri)
		out(p[id].ri);
	}
	void gongchan(int id){		
		int y=p[id].fa;
		int z=p[y].fa;
		p[y].ri=p[id].le;
		p[id].le=y;
		if(z){
			if(p[z].le==y){
				p[z].le=id;
			}else{
				p[z].ri=id;
			}
		}
		if(p[y].ri)
		p[p[y].ri].fa=y;
		p[y].fa=id;
		p[id].fa=z;
		if(y==root){
			root=id;
		}
		p[id].sizel=p[p[id].le].sizel+p[p[id].le].sizer+p[p[id].le].count;
		p[id].sizer=p[p[id].ri].sizel+p[p[id].ri].sizer+p[p[id].ri].count;
		p[y].sizel=p[p[y].le].sizel+p[p[y].le].sizer+p[p[y].le].count;
		p[y].sizer=p[p[y].ri].sizel+p[p[y].ri].sizer+p[p[y].ri].count;
		p[z].sizel=p[p[z].le].sizel+p[p[z].le].sizer+p[p[z].le].count;
		p[z].sizer=p[p[z].ri].sizel+p[p[z].ri].sizer+p[p[z].ri].count;
	}
	void ziben(int id){
		int y=p[id].fa;
		int z=p[y].fa;
		p[y].le=p[id].ri;
		p[id].ri=y;
		if(z){
			if(p[z].le==y){
				p[z].le=id;
			}else{
				p[z].ri=id;
			}
		}
		if(p[y].le)
		p[p[y].le].fa=y;
		p[y].fa=id;
		p[id].fa=z;
		if(y==root){
			root=id;
		}
		p[id].sizel=p[p[id].le].sizel+p[p[id].le].sizer+p[p[id].le].count;
		p[id].sizer=p[p[id].ri].sizel+p[p[id].ri].sizer+p[p[id].ri].count;
		p[y].sizel=p[p[y].le].sizel+p[p[y].le].sizer+p[p[y].le].count;
		p[y].sizer=p[p[y].ri].sizel+p[p[y].ri].sizer+p[p[y].ri].count;
		p[z].sizel=p[p[z].le].sizel+p[p[z].le].sizer+p[p[z].le].count;
		p[z].sizer=p[p[z].ri].sizel+p[p[z].ri].sizer+p[p[z].ri].count;
	}
};
findt t;

int main()
{
//	freopen("T.in","r",stdin);
//	freopen("T.out","w",stdout);

	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		int x,y;
	//	out(1);
		cin>>x>>y;
		if(x==1){
			t.insert(y,t.root);
		}
		if(x==2){
			t.del(y,t.root);
		}
		if(x==3){
			t.insert(y,t.root); 
			cout<<t.search_v(y,t.root)<<endl;
			t.del(y,t.root);
		}if(x==4){
		//	insert(y,root); 
			cout<<t.search_t(y,t.root)<<endl;
		//	del(y,root);
		}
		if(x==5){
			cout<<t.ton(y,t.root)<<endl;
		}if(x==6){
			cout<<t.pon(y,t.root)<<endl;
		}
	//	cout<<t.root;
	//	t.out(t.root);
		
//		
	} 
	
	return 0;
}

posted @ 2025-07-11 19:09  MagicalGirl_MH  阅读(21)  评论(1)    收藏  举报