MLE求助
查看原帖
MLE求助
405894
233L楼主2022/1/22 20:09

RT

#include<bits/stdc++.h>
#define N 10004 
using namespace std;
int q,root,len;
struct node{
	int val,ch[2],cnt,siz;
}tree[N];

inline int ls(int id){return tree[id].ch[0];}
inline int rs(int id){return tree[id].ch[1];}
inline int new_node(int val){
	tree[++len]={val,{0,0},1,1};
	return len;
}
inline void push_up(int id){
	tree[id].siz=tree[ls(id)].siz+tree[rs(id)].siz+tree[id].cnt;
}
void insert(int &id,int val){
	if(!id){
		id=new_node(val);
		return;
	}
	//tree[id].siz++;
	if(val<tree[id].val)
		insert(tree[id].ch[0],val);
	else if(val>tree[id].val)
		insert(tree[id].ch[1],val);
	else
		tree[id].cnt++;
	push_up(id);
}
int rnk(int id,int val){
	if(val<tree[id].val)
		return rnk(ls(id),val);
	if(val>tree[id].val)
		return rnk(rs(id),val)+tree[ls(id)].siz+tree[id].cnt;
	return tree[ls(id)].siz;
}
int kth(int id,int k){
	if(k<=tree[ls(id)].siz)
		return kth(ls(id),k);
	if(k>tree[id].cnt+tree[ls(id)].siz)
		return kth(rs(id),k-tree[id].cnt-tree[ls(id)].siz);
	return tree[id].val;
}
int forward(int id,int val){
	if(!id)return -2147483647;
	if(val<=tree[id].val)
		return forward(ls(id),val);
	return max(tree[id].val,forward(rs(id),val));
}
int backward(int id,int val){
	if(!id)return 2147483647;
	if(val>=tree[id].val)
		return backward(rs(id),val);
	return min(tree[id].val,backward(ls(id),val));
}

int main(){
	int op,x;
	scanf("%d",&q);
	while(q--){
		scanf("%d%d",&op,&x);
		switch(op){
			case 1:
				printf("%d\n",rnk(root,x)+1);
				break;
			case 2:
				printf("%d\n",kth(root,x));
				break;
			case 3:
				printf("%d\n",forward(root,x));
				break;
			case 4:
				printf("%d\n",backward(root,x));
				break;
			case 5:insert(root,x);break;
		}
	}
}
2022/1/22 20:09
加载中...