求助!WA*3
查看原帖
求助!WA*3
1187324
yandi_楼主2024/11/29 21:07
#include<iostream>
#include<map>
using namespace std;
struct tree{
	int value,lt,rt,si;
};
tree inTree[10000+1];
int tot=0;
map<int,bool>	dp;
void insert(int x,int pos){
	inTree[pos].si++;
	if(tot==0){
		inTree[++tot].value=x;
		return;
	}
	if(x<inTree[pos].value){
		if(!inTree[pos].lt){
			inTree[pos].lt=++tot;
			inTree[tot].value=x;
			inTree[tot].si=1;
			return;
		}else{
			insert(x,inTree[pos].lt);
		}
	}else{
		if(!inTree[pos].rt){
			inTree[pos].rt=++tot;
			inTree[tot].value=x;
			inTree[tot].si=1;
			return;
		}else{
			insert(x,inTree[pos].rt);
		}
	}
}
int findRank(int x,int pos){
	if(pos==0)	return 0;
	if(x==inTree[pos].value){
		return inTree[inTree[pos].lt].si;
	}else if(x<inTree[pos].value){
		return findRank(x,inTree[pos].lt);
	}else{
		return inTree[inTree[pos].lt].si+1+findRank(x,inTree[pos].rt);
	}
}
int findNumber(int x,int pos){
	if(pos==0)	return 0;
	if(inTree[inTree[pos].lt].si+1==x){
		return inTree[pos].value;
	}else if(inTree[inTree[pos].lt].si+1>x){
		return findNumber(x,inTree[pos].lt);
	}else{
		return findNumber(x-inTree[inTree[pos].lt].si-1,inTree[pos].rt);
	}
}
int main(){
	int q;
	cin>>q;
	for(int i=1;i<=q;i++){
		int op,x;
		cin>>op>>x;
		int t;
		switch(op){
			case 1:
				cout<<findRank(x,1)+1<<endl;
				break;
			case 2:
				cout<<findNumber(x,1)<<endl;
				break;
			case 3:
				t=findRank(x,1);
				t=findNumber(t,1);
				if(t)	cout<<t<<endl;
				else	cout<<-2147483647<<endl;	
				break;
			case 4:
				if(dp[x])	t=findRank(x,1)+2;
				else	t=findRank(x,1)+1;
				t=findNumber(t,1);
				if(t)	cout<<t<<endl;
				else	cout<<2147483647<<endl;
				break;
			case 5:
				dp[x]=1;
				insert(x,1);
				break;
		}
	}
	return 0;
}
2024/11/29 21:07
加载中...