全WA求助
查看原帖
全WA求助
1159883
QRCODE111楼主2024/11/19 20:00
#include<iostream>
#define np nullptr
using namespace std;

struct node{
	int x,s;
	node *l,*r;
	
	node(int val):x(val),s(1),l(np),r(np){}
	
	public:
	int getlsz(){
		return (l ? l->s : 0);
	}
	int getrsz(){
		return (r ? r->s : 0);
	}
};

node* ins(node* r,int val){
	if(r==np) return new node(val);
	if(val<r->x){
		r->l=ins(r->l,val);
	}else if(val>r->x){
		r->r=ins(r->r,val);
	}
	r->s=r->getlsz()+r->getrsz()+1;
	return r;
}

int getrk(node* r,int val){
	if(r==np) return 0;
	if(val==r->x){
		return r->getlsz()+1;
	}else if(val>r->x){
		return getrk(r->r,val)+r->getlsz()+1;
	}else{
		return getrk(r->l,val);
	}
}

int getn(node* r,int rk){
	if(r==np) return 0;
	if(r->l){
		if(r->l->s >= rk)return getn(r->l,rk);
		if(r->l->s+1 == rk)return r->x;
	}else{
		if(rk==1)return r->x;
	}
	return getn(r->r, rk- r->getlsz() -1);
}

int getpre(node* r,int x){
	int tmp=getrk(r,x);
	if(tmp<=1)return -2147383647;
	return getn(r,tmp-1);
}

int getnxt(node* r,int x){
	int tmp=getrk(r,x);
	if(tmp>=r->getlsz()+r->getrsz()+1)return 2147383647;
	return getn(r,tmp+1);
}

int q,op,x;
node *r;
int main(){
	cin>>q;
	while(q--){
		cin>>op>>x;
		if(op==5){
			r=ins(r,x);
		}else if(op==1){
			cout<<getrk(r,x)<<endl;
		}else if(op==2){
			cout<<getn(r,x)<<endl;
		}else if(op==3){
			cout<<getpre(r,x)<<endl;
		}else if(op==4){
			cout<<getnxt(r,x)<<endl;
		}
	}
	return 0;
}
2024/11/19 20:00
加载中...