全wa求助
查看原帖
全wa求助
886208
Atwi_llljx楼主2024/7/22 18:32
/*



*/
#include<bits/stdc++.h>
#define r Read()
#define int long long
#define MAX 0x3f3f3f3f
#define MIN -0x3f3f3f3f
using namespace std;
int read();
int nn,nnn,n,in,tot,root,xxxx,ch[1000010][5],v[1000010],w[1000010],cnt[1000010],size[1000010];
int Read(){
    int dx=0,x=1;
    char xx=getchar();
    for(;xx<'0'||xx>'9';xx=getchar())
		if(xx=='-')
			x=-1;
	for(;xx>='0'&&xx<='9';dx=dx*10+xx-48,xx=getchar());
	return dx*x;
}
int New(int x){
	tot++;
	v[tot]=x;
	w[tot]=rand();
	size[tot]=cnt[tot]=1;
	return tot;
}
void Update(int id){
	size[id]=size[ch[id][0]]+size[ch[id][1]]+cnt[id]; 
}
void Build(){
	root=New(MIN);
	ch[root][1]=New(MAX);
	Update(root);
}
void Rotate(int &id,int xx){
	int temp=ch[id][xx^1];
	ch[id][xx^1]=ch[temp][xx];
	ch[temp][xx]=id;
	id=temp;
	Update(ch[id][xx]);
	Update(id);
}
void Insert(int &id,int x){
	if(!id){
		id=New(x);
		return;
	}
	if(x==v[id])
		cnt[id]++;
	else{
		int xx=x<v[id]?0:1;
		Insert(ch[id][xx],x);
		if(w[id]<w[ch[id][xx]])
			Rotate(id,xx^1);
	}
	Update(id);
}
void Remove(int &id,int x){
	if(!id)
		return;
	if(x==v[id]){
		if(cnt[id]>1){
			cnt[id]--;
			Update(id);
			return;
		}
		if(ch[id][0]||ch[id][1]){
			if(!ch[id][1]||w[ch[id][0]]>w[ch[id][1]]){
				Rotate(id,1);
				Remove(ch[id][1],x);
			}else{
				Rotate(id,0);
				Remove(ch[id][0],x);
			}
			Update(id);
		}else
			id=0;
		return;
	}
	if(x<v[id])
		Remove(ch[id][0],x);
	else
		Remove(ch[id][1],x);
	Update(id);
}
int Getrank(int id,int x){
	if(!id)
		return 1;
	if(x==v[id])
		return size[ch[id][0]]+1;
	if(x<v[id])
		return Getrank(ch[id][0],x);
	return size[ch[id][0]]+cnt[id]+Getrank(ch[id][1],x); 
}
int Getv(int id,int x){
	if(!id)
		return -1;
	if(x<=size[ch[id][0]])
		return Getv(ch[id][0],x);
	if(x<=size[ch[id][0]]+cnt[id])
		return v[id];
	return Getv(ch[id][1],x-size[ch[id][0]]-cnt[id]);
}
int Getlast(int x){
	int id=root,xx;
	for(;id;){
		if(v[id]==x)
			return x;
		if(v[id]<x){
			xx=v[id];
			id=ch[id][1];
		}else
			id=ch[id][0];
	}
	return xx;
}
int Getnext(int x){
	int id=root,xx;
	for(;id;){
		if(v[id]>x){
			xx=v[id];
			id=ch[id][0];
		}else
			id=ch[id][1];
	}
	return xx;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	Build();
	cin>>n>>in;
	for(int o=1;o<=n;o++){
		char xx;
		int xxx,xxxxx,xxxxxx;
		cin>>xx>>xxx;
		switch(xx){
			case 'I':
				if(xxx-xxxx>=in){
					Insert(root,xxx-xxxx);
					nn++;
					nnn++;
				}
				break;
			case 'A':
				in-=xxx;
				xxxx+=xxx;
			case 'S':
				in+=xxx;
				xxxx-=xxx;
				xxxxx=in-1;
				for(;Getlast(xxxxx)!=MIN;){
					xxxxxx=xxxxx;
					xxxxx=Getlast(xxxxx);
					Remove(root,Getlast(xxxxxx));
					nn--;
				}
				break;
			case 'F':
				if(nn<xxx)
					cout<<"-1\n";
				else
					cout<<Getv(root,nn-xxx+2)+xxxx<<"\n";
		}
	}
	cout<<nnn-nn;
	return 0;
}

2024/7/22 18:32
加载中...