treap 7pts(#3)悬关求调qaq
查看原帖
treap 7pts(#3)悬关求调qaq
853503
Ayk71200楼主2024/3/13 21:36
#include<bits/stdc++.h>
using namespace std;
int root,cnt;
const int inf=10000005;
struct tree{
	int a[2],v,k,m,si;
}t[100005];
void pushu(int x){
t[x].si=t[t[x].a[0]].si+t[t[x].a[1]].si+t[x].m;
}
int newe(int val){
t[++cnt].v=val;
t[cnt].k=rand();
t[cnt].si=1;
t[cnt].m=1;
return cnt;
}
void bulid(){
root=newe(-inf),newe(inf);
t[1].a[1]=2;
pushu(root);
}
void klkl(int &x){
int id=t[x].a[1];
t[x].a[1]=t[id].a[0];
t[id].a[0]=x;
x=id;
pushu(x),pushu(t[x].a[0]);
}
void krkr(int &x){
int id=t[x].a[0];
t[x].a[0]=t[id].a[1];
t[id].a[1]=x;
x=id;
pushu(x),pushu(t[x].a[1]);
}
void add(int &p,int val){
if(!p) {
p=newe(val);
return;}
if(t[p].v==val) {
	t[p].m++;
	pushu(p);
	return;
}
if(val<t[p].v){
	add(t[p].a[0],val);
	if(t[p].k<t[t[p].a[0]].k) krkr(p);
}
else{
	add(t[p].a[1],val);
	if(t[p].k<t[t[p].a[1]].k) klkl(p);	
}
pushu(p);
}

void del(int &p,int val){
if(!p)return;
if(t[p].v==val){
	if(t[p].m>1) {
	t[p].m--;
	pushu(p);
	return;	
	}
	if(t[p].a[0]||t[p].a[1]){
		if(!t[p].a[0]||t[t[p].a[0]].k<t[t[p].a[1]].k) klkl(p),del(t[p].a[1],val);
		else krkr(p),del(t[p].a[0],val);
		pushu(p);
	}
	else {
	p=0;
	return;}
}	
t[p].v<val?del(t[p].a[0],val):del(t[p].a[1],val);
pushu(p);	
}
int pm(int p,int val){
	if(!p) return 1;
	if(t[p].v==val) return t[t[p].a[0]].si+1;
return	t[p].v<val? pm(t[p].a[1],val):pm(t[p].a[0],val);
}
int mp(int p,int gw){
	if(!p) return inf;
	if(t[t[p].a[0]].si>=gw) return mp(t[p].a[0],gw);
	if(t[t[p].a[0]].si+t[p].m>=gw) return t[p].v;
	return mp(t[p].a[1],gw-t[t[p].a[0]].si-t[p].m);
}
int qq(int val){
int p=root,ans=1;
while(p){
if(t[p].v==val){
if(t[p].a[0]){
	p=t[p].a[0];
	while(t[p].a[1]) p=t[p].a[1];
	ans=p;
}
break;
}	
if(t[p].v<val&&t[ans].v<t[p].v) ans=p;	
p=val<t[p].v?t[p].a[0]:t[p].a[1];
}
return t[ans].v;
}
int hx(int val){
int p=root,ans=2;
while(p){
if(t[p].v==val){
if(t[p].a[1]){
	p=t[p].a[1];
	while(t[p].a[0]) p=t[p].a[0];
	ans=p;
}
break;
}	
if(t[p].v>val&&t[ans].v>t[p].v) ans=p;	
p=val<t[p].v?t[p].a[0]:t[p].a[1];
}
return t[ans].v;	
}


int main(){
	bulid();
int n,a,b;
scanf("%d",&n);
while(n--){
scanf("%d%d",&a,&b);
switch(a){
	case 1:{
		add(root,b);
		break;
	}
	case 2:{
		del(root,b);
		break;
	}	
	case 3:{
	printf("%d\n",pm(root,b)-1);
		break;
	}
	case 4:{
	printf("%d\n",mp(root,b+1));	
		break;
	}
	case 5:{
	printf("%d\n",qq(b));
		break;
	}
	case 6:{
	printf("%d\n",hx(b));	
		break;
	}				
}}	
return 0;	
}

2024/3/13 21:36
加载中...