求条!
查看原帖
求条!
627732
Fuxh_18楼主2025/2/6 09:32
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1,inf=INT_MAX;
struct zz{
	int s[2],v,p,size,cnt;
	void init(int _v,int _p){
		v=_v,p=_p;
		size=cnt=1;
	}
}tr[N];
int n,m,root,idx,dt,ans;
void push_up(int x){
	tr[x].size=tr[tr[x].s[0]].size+tr[tr[x].s[1]].size+tr[x].cnt;
}
void rotate(int x){
	int y=tr[x].p,z=tr[y].p;
	bool k=tr[y].s[1]==x;
	tr[z].s[tr[z].s[1]==y]=x,tr[x].p=z;
	tr[y].s[k]=tr[x].s[k^1],tr[tr[x].s[k^1]].p=y;
	tr[x].s[k^1]=y,tr[y].p=x;
	push_up(y),push_up(x);
}
void splay(int x,int k){
	while(tr[x].p!=k){
		int y=tr[x].p,z=tr[y].p;
		if(z!=k){
			if((tr[y].s[1]==x)^(tr[z].s[1]==y)) rotate(x);
			else rotate(y);
		}
		rotate(x);
	}
	if(!k) root=x;
}
void insert(int x){
	int u=root,p=0;
	while(u&&x!=tr[u].v) p=u,u=tr[u].s[x>tr[u].v];
	if(!u){
		u=++idx;
		if(p) tr[p].s[x>tr[p].v]=u;
		tr[u].init(x,p);
	}
	else tr[u].cnt++;
	splay(u,0);
}
int kth(int k){
	int u=root;
	if(k>tr[u].size-1) return -1;
	while(1){
		if(k<=tr[tr[u].s[0]].size) u=tr[u].s[0];
		else if(k>tr[tr[u].s[0]].size+tr[u].cnt) k-=tr[tr[u].s[0]].size+tr[u].cnt,u=tr[u].s[1];
		else return tr[u].v;
	}
}
void find(int x){
	int u=root;
	if(!u) return;
	while(tr[u].s[x>tr[u].v]&&x!=tr[u].v){
		u=tr[u].s[x>tr[u].v];
	}
	splay(u,0);
}
int get_nxt(int x,bool f){
	find(x);
	int u=root;
	if((tr[u].v>x&&f)||(tr[u].v<x&&!f)) return u;
	u=tr[u].s[f];
	while(tr[u].s[!f]){
		u=tr[u].s[!f];
	}
	return u;
}
void del(int x){
	int l=get_nxt(x,0),r=get_nxt(x,1);
	splay(l,0),splay(r,l);
	if(tr[tr[r].s[0]].cnt>1){
		tr[tr[r].s[0]].cnt--;
		splay(tr[r].s[0],0);
	}
	else tr[r].s[0]=0;
}
int main(){
	cin>>n>>m;
	insert(inf),insert(-inf);
	for(int i=1;i<=n;i++){
		char opt;
		int c;
		cin>>opt>>c;
		if(opt=='I'){
			if(c>=m){
				insert(c);
			}
		}
		if(opt=='A') dt+=c;
		if(opt=='S'){
			dt-=c;
			if(dt<0){
				insert(m-dt);
				find(-inf);
				int l=root;
				find(m-dt);
				int r=root;
				splay(l,0),splay(r,l);
				ans+=tr[tr[r].s[0]].size;
				tr[r].s[0]=0;
				del(m-dt);
			}
		}
		if(opt=='F'){
			cout<<kth(c+1)+dt<<endl;
		}
	}
	cout<<ans;
	return 0;
}
2025/2/6 09:32
加载中...