FHQTreap 14pts 求调教
查看原帖
FHQTreap 14pts 求调教
602632
_7Mr楼主2023/12/31 11:11
#include<bits/stdc++.h>
#define int long long
#define double long double
#define INF INT_MAX
using namespace std;
const int maxn=5e5+5;
int n,root,cnt;
struct node{
	int key,val,siz,l,r;
	#define key(dq) t[dq].key
	#define sum(dq) t[dq].val
	#define siz(dq) t[dq].siz
	#define l(dq) t[dq].l
	#define r(dq) t[dq].r
}t[maxn];
void up_date(int dq){siz(dq)=siz(l(dq))+siz(r(dq))+1;}
int Merge(int x,int y){
	if(!x || !y) return x+y;
	if(key(x)<key(y)) {
		r(x)=Merge(r(x),y);
		up_date(x);
		return x;
	}
	else{
		l(y)=Merge(x,l(y));
		up_date(y);
		return y;
	}
}
void Split(int dq,int d,int &x,int &y){
	if(!dq){
		x=y=0;
		return;
	}
	if(sum(dq)<=d){
		Split(r(dq),d,r(dq),y);
		x=dq;
	}
	else{
		Split(l(dq),d,x,l(dq));
		y=dq;
	}
	up_date(dq);
}
void Insert(int dq){
	key(++cnt)=rand();
	sum(cnt)=dq;
	siz(cnt)=1;
	l(dq)=r(dq)=0;
	int l,r;
	Split(root,dq,l,r);
	root=Merge(Merge(l,cnt),r);
}
void Delete(int dq){
	int l,r;
	Split(root,dq,l,r);
	int zc1,zc2;
	Split(l,dq-1,zc1,zc2);
	root=Merge(Merge(zc1,Merge(l(zc2),r(zc2))),r);
}
int Rank(int dq){
	int l,r;
	Split(root,dq-1,l,r);
	root=Merge(l,r);
	return siz(l)+1;
}
int Kth(int dq,int d){
	if(d==siz(l(dq))+1) return dq;
	else if(d<=siz(l(dq))) return Kth(l(dq),d);
	else return Kth(r(dq),d-siz(l(dq))-1);
}
int Pre(int dq){
	int l,r;
	Split(root,dq-1,l,r);
	root=Merge(l,r);
	return sum(Kth(l,siz(l)));
}
int Next(int dq){
	int l,r;
	Split(root,dq,l,r);
	root=Merge(l,r);
	return sum(Kth(r,1));
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	srand(time(NULL)); 
	cin>>n;
	while(n--){
		int op,x;
		cin>>op>>x;
		if(op==1) Insert(x);
		else if(op==2) Delete(x);
		else if(op==3) cout<<Rank(x)<<endl;
		else if(op==4) cout<<sum(Kth(root,x))<<endl;
		else if(op==5) cout<<Pre(x)<<endl;
		else cout<<Next(x)<<endl;
	}
	return 0;
}
2023/12/31 11:11
加载中...