记录编号 467107 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [HZOI 2016]tb的平衡树 最终得分 100
用户昵称 GravatarHzoi_Mafia 是否通过 通过
代码语言 C++ 运行时间 4.539 s
提交时间 2017-10-30 08:13:16 内存使用 0.31 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
inline int read(){
	int sum(0),f(1);char ch(getchar());
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';sum=sum*10+(ch^48),ch=getchar());
	return sum*f;
}
const int ADD(32768);
const int inf(0x3f3f3f3f);
#define get_size(x) (x?x->size:0)
struct node{
	node *ch[2];int size;
	//node():size(0){ch[0]=ch[1]=NULL;}
}*root,*null;
inline node* newnode(){
	node *tmp(new node);
	tmp->ch[0]=tmp->ch[1]=null;tmp->size=0;return tmp;
}
inline void insert(node *&x,int key,int dep){
	if(x==null)x=newnode();++x->size;if(dep==-1)return;
	int tmp((key>>dep)&1);insert(x->ch[tmp],key,dep-1);
}
inline void del(node *&x,int key,int dep){
	--x->size;if(dep==-1)return;
	int tmp((key>>dep)&1);del(x->ch[tmp],key,dep-1);
}
inline int Rank(int x){
	node *now(root);int ret(0),dep(16);
	for(;dep>=0;--dep){
//		if(!now)return ret;
		int tmp((x>>dep)&1);
		if(tmp)ret+=now->ch[0]->size;
		now=now->ch[tmp];
	}
	return ret;
}
inline int kth(int k){
	node *now(root);int dep(16),ret(0);
	for(;dep>=0;--dep){
//		if(!now)return ret;
		if(now->ch[0]->size>=k)now=now->ch[0];
		else k-=now->ch[0]->size,now=now->ch[1],ret|=1<<dep;
	}
	return ret;
}
int n;
int main(){
	freopen("tb_kp.in","r",stdin);freopen("tb_kp.out","w",stdout);
	null=new node;null->ch[0]=null->ch[1]=null;root=null;
	n=read();
	while(n--){
		int op(read());
		if(op==7){printf("%d\n",kth(1)-ADD);continue;}
		if(op==8){printf("%d\n",kth(root->size)-ADD);continue;}
		int x(read());
		if(op==1)insert(root,x+ADD,16);
		if(op==2)del(root,x+ADD,16);
		if(op==3)printf("%d\n",Rank(x+ADD)+1);
		if(op==4)printf("%d\n",kth(x)-ADD);
		if(op==5){int tmp(Rank(x+ADD)+1);if(tmp==1)printf("%d\n",-inf);else printf("%d\n",kth(tmp-1)-ADD);}
		if(op==6){int tmp(Rank(x+ADD+1));if(tmp==get_size(root))printf("%d\n",inf);else printf("%d\n",kth(tmp+1)-ADD);}
	}
}