比赛 清华集训2017模板练习 评测结果 AAAAAAAAAA
题目名称 普通平衡树 最终得分 100
用户昵称 FoolMike 运行时间 0.250 s
代码语言 C++ 内存使用 1.84 MiB
提交时间 2017-12-02 20:47:22
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;

struct leave
{
	int l,r,s,k;
}t[100010]={0};

const int maxl=99999999;
int top=0,n,e,i,x=0;

int size(int x) {return t[t[x].l].s+t[t[x].r].s+1;}

void l_rotate(int &x)
{
	int y=t[x].r;
	t[x].r=t[y].l;t[y].l=x;
	t[x].s=size(x);t[y].s=size(y);
	x=y;
	return;
}

void r_rotate(int &x)
{
	int y=t[x].l;
	t[x].l=t[y].r;t[y].r=x;
	t[x].s=size(x);t[y].s=size(y);
	x=y;
	return;
}

void Maintain(int &x,bool y)
{
	if (not y){
		if (t[t[t[x].l].l].s>t[t[x].r].s) r_rotate(x);
		else if (t[t[t[x].l].r].s>t[t[x].r].s){
			l_rotate(t[x].l);r_rotate(x);
		}
		else return;
	}
	else{
		if (t[t[t[x].r].r].s>t[t[x].l].s) l_rotate(x);
		else if (t[t[t[x].r].l].s>t[t[x].l].s){
			r_rotate(t[x].r);l_rotate(x);
		}
		else return;
	}
	Maintain(t[x].l,false);
	Maintain(t[x].r,true);
	Maintain(x,true);
	Maintain(x,false);
	return;
}

void insert(int &x,int key)
{
	if (x==0){
		top++;x=top;t[x].k=key;t[x].l=t[x].r=0;t[x].s=1;return;
	}
	t[x].s++;
	if (key>t[x].k) insert(t[x].r,key);else insert(t[x].l,key);
	Maintain(x,key>t[x].k);
	return;
}

int rank(int x,int key)
{
	int ans=maxl;
	if (x==0) return ans;
	if (key==t[x].k) ans=t[t[x].l].s+1;
	if (key<=t[x].k) ans=min(ans,rank(t[x].l,key));
	if (key>t[x].k) ans=min(ans,t[t[x].l].s+1+rank(t[x].r,key));
	return ans;
}

int select(int x,int key)
{
	if (key<t[t[x].l].s+1) return select(t[x].l,key);
	if (key==t[t[x].l].s+1) return t[x].k;
	if (key>t[t[x].l].s+1) return select(t[x].r,key-t[t[x].l].s-1);
}

int pred(int x,int key)
{
	int ans=-maxl;
	if (x==0) return ans;
	if (t[x].k<key) ans=t[x].k;
	if (t[x].k<key) ans=max(ans,pred(t[x].r,key));
	if (t[x].k>=key) return pred(t[x].l,key);
	return ans;
}

int succ(int x,int key)
{
	int ans=maxl;
	if (x==0) return ans;
	if (t[x].k>key) ans=t[x].k;
	if (t[x].k>key) ans=min(ans,succ(t[x].l,key));
	if (t[x].k<=key) return succ(t[x].r,key);
	return ans;
}

void del(int &x,int key)
{
	t[x].s--;
	if (key>t[x].k) del(t[x].r,key);
	if (key<t[x].k) del(t[x].l,key);
	if (key==t[x].k){
		if (t[x].l!=0&&t[x].r==0){
			x=t[x].l;return;
		}
		if (t[x].l==0&&t[x].r!=0){
			x=t[x].r;return;
		}
		if (t[x].l==0&&t[x].r==0){
			x=0;return;
		}
		if (t[x].l!=0&&t[x].r!=0){
			int y=select(t[x].r,1);
			t[x].k=y;
			del(t[x].r,y);
		}
	}
	return;
}

void bianli(int x,int c)
{
	if (x==0) return;
	for (int i=1;i<=c;i++) printf(" ");
	printf("%d\n",t[x].k);
	bianli(t[x].l,c+2);
	bianli(t[x].r,c+2);
	return;
}

int main()
{
	freopen("phs.in","r",stdin);
	freopen("phs.out","w",stdout);
	scanf("%d",&n);
	for (;n>0;n--){
		scanf("%d%d",&e,&i);
		if (e==1) insert(x,i);
		if (e==2) del(x,i);
		if (e==3) printf("%d\n",rank(x,i));
		if (e==4) printf("%d\n",select(x,i));
		if (e==5) printf("%d\n",pred(x,i));
		if (e==6) printf("%d\n",succ(x,i));
	}
	return 0;
}