比赛 数据结构模板题 评测结果 AAAAAAAAAA
题目名称 普通平衡树 最终得分 100
用户昵称 郑霁桓 运行时间 0.812 s
代码语言 C++ 内存使用 4.48 MiB
提交时间 2025-04-15 19:05:16
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long T,op,xx,tp=1,tt,as,I=1e18,rt=1;
struct N{
	long long l,r,v,p,sz,ct;
}a[100005];
void pd(long long ps){
	a[ps].sz=a[a[ps].l].sz+a[a[ps].r].sz+a[ps].ct;return;
}
void zig(long long &ps){
	long long q=a[ps].l;
	a[ps].l=a[q].r,a[q].r=ps,ps=q;
	pd(a[ps].r),pd(ps);
}
void zag(long long &ps){
	long long q=a[ps].r;
	a[ps].r=a[q].l,a[q].l=ps,ps=q;
	pd(a[ps].l),pd(ps);
}
void ins(long long &ps,long long x){
    if(!ps){a[++tt]={0,0,x,rand(),1,1},ps=tt;return;}
	if(a[ps].v==x){a[ps].ct++,pd(ps);return;}
	if(x<a[ps].v){
		ins(a[ps].l,x);
		if(a[a[ps].l].p>a[ps].p) zig(ps);
	}
	if(x>a[ps].v){
		ins(a[ps].r,x);
		if(a[a[ps].r].p>a[ps].p) zag(ps);
		
	}
	pd(ps);
	return;
}
void era(long long &ps,long long x){
    if(!ps) return;
	if(a[ps].v==x){
		if(a[ps].ct>1){a[ps].ct--,pd(ps);return;} 
			if(!a[ps].l&&!a[ps].r){ps=0;return;}
			if(!a[ps].l||(a[a[ps].l].p<a[a[ps].r].p)){
				zag(ps),era(a[ps].l,x),pd(ps); 
				return;
			}else{
				zig(ps),era(a[ps].r,x),pd(ps);
				return;
			}
	}
	if(a[ps].v<x){era(a[ps].r,x),pd(ps);return;}
	if(a[ps].v>x){era(a[ps].l,x),pd(ps);return;}
}
long long vk(long long ps,long long x){
	if(!ps) return 0;	
	if(a[ps].v==x)  return a[a[ps].l].sz;
	if(a[ps].v>x) return vk(a[ps].l,x);
	if(a[ps].v<x) return vk(a[ps].r,x)+a[a[ps].l].sz+a[ps].ct;
}
long long kv(long long ps,long long x){
	if(!ps) return I;
	if(a[a[ps].l].sz>=x) return kv(a[ps].l,x);
	if(a[a[ps].l].sz+a[ps].ct>=x) return a[ps].v;
	return kv(a[ps].r,x-a[a[ps].l].sz-a[ps].ct);
}
long long pr(long long x){
	as=-1e15,tp=rt;
	while(tp){
		if(a[tp].v==x){
			if(a[tp].l>0){
				tp=a[tp].l;
				while(a[tp].r>0) tp=a[tp].r;
				as=a[tp].v;
				return as;
			}else return as;
		}
		if(a[tp].v>x) tp=a[tp].l;
		else as=max(as,a[tp].v),tp=a[tp].r;
	}
	return as;
}
long long nt(long long x){
	as=1e15,tp=rt;
	while(tp){
		if(a[tp].v==x){
			if(a[tp].r>0){
				tp=a[tp].r;
				while(a[tp].l>0)tp=a[tp].l;
				as=a[tp].v;
				return as;
			}else return as;
		}
		if(a[tp].v>x) as=min(as,a[tp].v),tp=a[tp].l;
		else tp=a[tp].r;
	}
	return as;
}
int main(){
	freopen("phs.in","r",stdin);
	freopen("phs.out","w",stdout);
	ios::sync_with_stdio(false);
	cin>>T;
	a[++tt]={0,0,-I,rand(),1,1};
	ins(rt,I);
	while(T--){
		cin>>op>>xx;
		if(op==1) ins(rt,xx);
		if(op==2) era(rt,xx);
		if(op==3) cout<<vk(rt,xx)<<"\n";
		if(op==4) cout<<kv(rt,xx+1)<<"\n";
		if(op==5) cout<<pr(xx)<<"\n";
		if(op==6) cout<<nt(xx)<<"\n";
	}
    return 0;
}