FHQ-treap学艺不精求调玄关
查看原帖
FHQ-treap学艺不精求调玄关
1162380
liverxiwo楼主2024/4/24 13:53
#include<bits/stdc++.h>
using namespace std;
int root=0,tot=0;
struct FHQ_treap{
	struct fhq_treap{
		int l,r,val,siz,dat;
	}tree[500005];
	inline void update(int x){
		tree[x].siz=tree[tree[x].l].siz+tree[tree[x].r].siz+1;
		return ;
	}
	inline int newnode(int x){
		tree[++tot].val=x;
		tree[tot].siz=1;
		tree[tot].dat=rand();
		return tot;
	}
	inline void split(int k,int key,int &x,int &y){
		if(k==0){
			x=y=0;
			return ;
		}
		if(tree[k].val<=key){
			x=k;
			split(tree[x].r,key,tree[x].r,y);
		}
		else{
			y=k;
			split(tree[y].l,key,x,tree[y].l);
		}
		update(k);
		return ;
	}
	inline int merge(int x,int y){
		if(x==0){
			return y;
		}
		if(y==0){
			return x;
		}
		if(tree[x].dat>tree[y].dat){
			tree[x].r=merge(tree[x].r,y);
			update(x);
			return x;
		}
		else{
			tree[y].l=merge(x,tree[y].l);
			update(y);
			return y;
		}
	}
	//bug on last
	void insert(int key){
		int x,y;
		split(root,key-1,x,y);
		int id=newnode(key);
		root=merge(merge(x,id),y);
		return ;
	}
	void remove(int key){
		int x,y,z;
		split(root,key-1,x,y);
		split(y,key,y,z);
		if(y){
			y=merge(tree[y].l,tree[y].r);
		}
		root=merge(merge(x,y),z);
		return ;
	}
	int rnk(int key){
		int x,y,ans;
		split(root,key-1,x,y);
		ans=tree[x].siz+1;
		root=merge(x,y);
		return ans;
	}
	int kth(int rnk){
		int p=root;
		while(p){
			if(tree[tree[p].l].siz+1==rnk){
				break;
			}
			else if(tree[tree[p].l].siz+1>rnk){
				p=tree[p].l;
			}
			else{
				rnk-=tree[tree[p].l].siz+1;
				p=tree[p].r;
			}
		}
		return tree[p].val;
	}
	int pre(int key){
		int x,y,p;
		split(root,key-1,x,y);
		p=x;
		while(tree[p].r!=0){
			p=tree[p].r;
		}
		root=merge(x,y);
		return tree[p].val;
	}
    int next(int key){
		int x,y,p;
		split(root,key,x,y);
		p=y;
		while(tree[p].l!=0){
			p=tree[p].l;
		}
		root=merge(x,y);
		return tree[p].val;
	}
	void build(){
		insert(0x7fffffff);
	    insert(-0x7fffffff);
	    root=1;
	    tree[1].r=2;
	    update(root);
	}
}treap;
int n,MIN,num,s,sum;
int main(){
	srand(time(0));
	scanf("%d%d",&n,&MIN);
	treap.build();
	for(int i=1;i<=n;i++){
		char op;
	    int	x;
		cin>>op>>x;
		if(op=='I'){
			if(x>=MIN){
				treap.insert(x-sum);
				num++,s++;
			}
		}
		else if(op=='A'){
			MIN-=x;
			sum+=x;
		}
		else if(op=='S'){
			MIN+=x;
			sum-=x;
			int a1=MIN-1,a2;
			while(treap.pre(a1)!=-0x7fffffff){
				a2=a1;
				a1=treap.pre(a1);
				treap.remove(treap.pre(a2));
				num--;
			}
		}
		else{
			if(num<x){
				printf("-1\n");
			}
			else{
				printf("%d\n",treap.rnk(num-x+2)+sum);
			}
		}
	}
	printf("%d",s-num);
}
2024/4/24 13:53
加载中...