rt
查看原帖
rt
1085779
duanhongwen楼主2024/10/11 01:01
#include<bits/stdc++.h>
using namespace std;
const int M=5e4+7;
struct tr
{
	int l,r,pre,end,maxx;
	
}t[M<<2];
void up(int p)
{
	t[p].pre=t[p<<1].pre==t[p<<1].r-t[p<<1].l+1?t[p<<1].pre+t[p<<1|1].pre:t[p<<1].pre;
	t[p].end=t[p<<1|1].end==t[p<<1|1].r-t[p<<1|1].l+1?t[p<<1|1].end+t[p<<1].end:t[p<<1|1].end;
	t[p].maxx=max(t[p<<1].maxx,max(t[p<<1].end+t[p<<1|1].pre,t[p<<1|1].maxx));
	
}
void buildtree(int l,int r,int p)
{
	t[p].l=l;
	t[p].r=r;
	if(l==r)
	{
		t[p].pre=t[p].end=t[p].maxx=1;
		return;
	}
	int mid=(l+r)>>1;
	buildtree(l,mid,p<<1);
	buildtree(mid+1,r,p<<1|1);
	up(p);
}
void change(int l,int r,int v,int p)
{
	if(l<=t[p].l&&t[p].r<=r)
	{
		t[p].pre=t[p].maxx=t[p].end=v;
		return;
	}
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid)
	{
		change(l,r,v,p<<1);
	}
	if(r>mid)
	{
		change(l,r,v,p<<1|1);
	}
	up(p);
}
int query(int k,int p)
{
	if(t[p].l==t[p].r)
	{
		return t[p].pre;
	}
	int mid=(t[p].r+t[p].l)>>1;
	if(k<=mid)
	{
		if(mid-t[p<<1].end<k)
		{
			return t[p<<1].end+t[p<<1|1].pre;
		}
		else
		return query(k,p<<1);
	}
	if(k>mid)
	{
		if(mid+t[p<<1|1].pre>=k)
		{
			return t[p<<1].end+t[p<<1|1].pre;
		}
		else
		return query(k,p<<1|1);
	}
	return 1;
}
int st[M],n,m,tot;
int main()
{
	cin>>n>>m;
	buildtree(1,n,1);
	m=m*2;
	for(int i=1;i<=m;i++)
	{
		char o;
		int k;
		scanf("%c",&o);
		if(o=='D')
		{
			scanf("%d",&k);
			change(k,k,0,1);
			st[++tot]=k;
		}
		if(o=='R')
		{
			change(st[tot],st[tot],1,1);
			tot--;
		}
		if(o=='Q')
		{
			scanf("%d",&k);
			cout<<query(k,1)<<endl;
		}
	}
}
2024/10/11 01:01
加载中...