FHQ-Treap 90pts 求助
查看原帖
FHQ-Treap 90pts 求助
735763
_ChongYun_楼主2024/7/3 08:58
#include<bits/stdc++.h>
#define int long long
using namespace std;
int q,minn,rt,l,r,px;
int qwq=0,sum=0,ans=0,cnt=0;
struct node{
	int l,r,siz,val,randval;
}Treap[1145141];
void pushup(int p){
	Treap[p].siz=Treap[Treap[p].l].siz+Treap[Treap[p].r].siz+1;
	return ;
}
void build(int x){
	++cnt;
	Treap[cnt].l=Treap[cnt].r=0;
	Treap[cnt].siz=1;
	Treap[cnt].val=x;
	Treap[cnt].randval=rand()%201019;
	return ;
}
void Split(int p,int val,int &l,int &r){
	if(!p){
		l=r=0;
		return ;
	}
	if(Treap[p].val<=val){ 
		l=p; 
		Split(Treap[p].r,val,Treap[p].r,r); 
	}else{
		r=p; 
		Split(Treap[p].l,val,l,Treap[p].l); 
	}
	pushup(p);
	return ;
}

int Merge(int l,int r){
	if(!l||!r) return l+r;
	if(Treap[l].randval<=Treap[r].randval){
		Treap[l].r=Merge(Treap[l].r,r);
		pushup(l);
		return l;
	}
	Treap[r].l=Merge(l,Treap[r].l);
	pushup(r);
	return r;
}

void Insert(int x){
	Split(rt,x,l,r);
	build(x);
	rt=Merge(Merge(l,cnt),r);
	return ;
}

void Delete(int x){
	Split(rt,x,l,r);
	Split(l,x-1,l,px);
	px=Merge(Treap[px].l,Treap[px].r);
	rt=Merge(Merge(l,px),r);
	return ;
}

int rk(int p,int k){
	if(k==Treap[Treap[p].l].siz+1) return p;
	if(k<Treap[Treap[p].l].siz+1) return rk(Treap[p].l,k);
	k-=Treap[Treap[p].l].siz+1;
	return rk(Treap[p].r,k);
}

int pre(int x){
	Split(rt,x-1,l,r);
	int now=l;
	while(Treap[now].r) now=Treap[now].r;
	int qans=Treap[now].val;
	rt=Merge(l,r);
	return qans;
}

signed main(){
	srand(20111019);
	cin>>q>>minn;
	while(q--){
		char op;
		int x;
		cin>>op>>x;
		if(op=='I'){
			if(x+qwq<minn) continue;
			Insert(x+qwq);
		}
		if(op=='A'){
			qwq-=x;
			minn-=x;
			while(pre(minn)){
				Delete(pre(minn));
				ans++;
			}
		}
		if(op=='S'){
			qwq+=x;
			minn+=x;
			while(pre(minn)){
				Delete(pre(minn));
				ans++;
			}
		}
		if(op=='F'){
			if(x>Treap[rt].siz) printf("-1\n");
			else cout<<Treap[rk(rt,Treap[rt].siz-x+1)].val-qwq<<endl;
		}
	}
	cout<<ans<<endl;
	return 0;
}

2024/7/3 08:58
加载中...