Fhq-Treap40pts求调
查看原帖
Fhq-Treap40pts求调
1061320
Isharmla楼主2023/9/26 17:10
#include<bits/stdc++.h>
using namespace std;

#define int long long 

#define F(i,a,b) for(int i=a;i<=b;i++)
#define ls(x) ls[x]
#define rs(x) rs[x]

const int N=1e6+5;

int ls[N],rs[N],siz[N],tot,val[N],pre[N],rt,x,y,n,m,Delta;

char c;

inline int read()
{
	int x = 0, f = 1;
	char c = getchar();
	while (c < '0' || c > '9')
	{
		if (c == '-')
			f *= -1;
		c = getchar();
	}
	while (c <= '9' && c >= '0')
	{
		x = (x << 3) + (x << 1) + (c ^ 48);
		c = getchar();
	}
	return x * f;
}

inline int Make_Edge(int k){
	siz[++tot]=1;
	val[tot]=k;
	pre[k]=rand();
	return tot;
}

inline void Update(int x){
	siz[x]=siz[ls(x)]+siz[rs(x)]+1;
	return;
}

inline void spilt(int now,int k,int &x,int &y){
	if(!now){
		x=0,y=0;
		return;
	}
	if(val[now]<=k){
		x=now;	
		spilt(rs(now),k,rs(now),y);
	}else{
		y=now;
		spilt(ls(now),k,x,ls(now));
	}
	Update(now);
}

inline int Merge(int x,int y){
	if(!x||!y) return x|y;
	if(pre[x]<pre[y]){
		rs(x)=Merge(rs(x),y);
		Update(x);
		return x;
	}else{
		ls(y)=Merge(x,ls(y));
		Update(y);
		return y;
	}
}
inline void insert(int k){
	if(k<m) return;
	spilt(rt,k-Delta,x,y);
	rt=Merge(x,Merge(Make_Edge(k-Delta),y));
}
inline int kth(int now,int k){
	while(true){		
		if(k<=siz[ls(now)]) now=ls(now);
		if(siz[ls(now)]+1==k) return now;
		if(k>siz[ls(now)]){k-=siz[ls(now)]+1;now=rs(now);}
	}
}

signed main(){
//	freopen("P1486_2.in","r",stdin);
	//freopen("Ans.in","w",stdout);
	srand(time(0));
	n=read(),m=read();
	int Left=0;
	for(int i=1,k;i<=n;i++){
		cin>>c;k=read();
		if(c=='I'){insert(k);}
		if(c=='A'){Delta+=k;}
		if(c=='S'){Delta-=k;spilt(rt,m-Delta-1,x,y),rt=y;Left+=siz[x];}
		if(c=='F'){if(siz[rt]<k){printf("-1\n");continue;}}//printf("%lld \n",val[kth(rt,siz[rt]-k+1)]+Delta);}
	}
	cout<<Left<<endl;
	return 0;
}
2023/9/26 17:10
加载中...