这个代码为什么在Subtask #0全RE了
查看原帖
这个代码为什么在Subtask #0全RE了
1447078
sxttty楼主2024/10/6 00:46
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct tree{
	int l=0,r=0,v=0,size=0,t=0;
}a[100200];
int cont;
int fi(int x,int root){
	if(root==0)	return 1;	
	else if (x==a[root].v)	return a[a[root].l].size+1+a[a[root].l].t;
	else if(x<a[root].v)	return fi(x,a[root].l);
	else if(x>a[root].v)	return fi(x,a[root].r)+a[a[root].l].size+a[root].t;
}
void do1(int x){
	cout<<fi(x,1)<<endl;
}
int f2(int x,int root){
	if(x<=a[a[root].l].size+a[a[root].l].t){
		f2(x,a[root].l);
	}
	else if(x>a[a[root].l].size + a[a[root].l].t+1){
		f2(x-a[a[root].l].size-a[root].t,a[root].r);
	}
	else if(x==a[a[root].l].size + a[a[root].l].t+1){
		return	a[root].v;
	}
}
void do2(int x){
	cout<<f2(x,1)<<endl;
}
void do3(int x,int p){
	int ct00,ct11,i=1;//先查x的排名,在找比x排名小的第一个数 ,ct00为原数的排名,ct11为原数排名-1,2,3...得到的新数 
	if(p==-1){
		ct00=fi(x,1);
		cout<<ct00;
		do{
			if(ct00==1){
				ct11= -2147483647;
				break;
			}	
			ct11=f2(ct00-i,1);
			i++;
		}while(x==ct11);
		cout<<ct11<<endl;
	}
	if(p==1){
		ct00=fi(x,1);
		do{
			if(ct00==a[1].size+a[1].t){
				ct11= 2147483647;
				break;
			}	
			ct11=f2(ct00+i,1);
			i++;
		}while(x==ct11);
		cout<<ct11<<endl;
	}
}
void do5(int x,int root){
	if(x<a[root].v){
		if(!a[root].l){		cont++;
			a[root].l=cont;	a[root].size++;
			a[cont].v=x;	a[cont].l=0;	a[cont].r=0;	a[cont].t=1;	a[cont].size=0;	}
		else {
			a[root].size++;
			do5(x,a[root].l);
		}}
	else if(x>a[root].v){
		if(!a[root].r){		cont++;
			a[root].r=cont;	a[root].size++;
			a[cont].v=x;	a[cont].l=0;	a[cont].r=0;	a[cont].t=1;	a[cont].size=0;	}
		else {
			a[root].size++;
			do5(x,a[root].r);
		}}
	else {
		cont++;
		a[root].t++;
	}
}
signed main(){
	int q,op,x;
	cin>>q;
	for(int i=0;i<q;i++){
		cin>>op>>x;
		if(op==1)	do1(x);	
		else if(op==2)	do2(x);
		else if(op==3)	do3(x,-1);
		else if(op==4)	do3(x,1);
		else if(cont ==0){cont++;
			a[cont].v=x;a[cont].t++;a[cont].size++;}
		else do5(x,1);
	}
	return 0;
}
2024/10/6 00:46
加载中...