萌新刚学OI,#13 #14 RE了一个晚上,求调错。
查看原帖
萌新刚学OI,#13 #14 RE了一个晚上,求调错。
19228
蒟蒻炒扇贝楼主2022/10/11 20:32

RT。

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define pir pair<int,int>
#define fs first
#define sc second
const int MAXN=5e5+5;
int n,q,a[MAXN],p[MAXN],cnt,bl[MAXN],id[MAXN];
pir opt[MAXN];
vector<pir>v;
struct sgt
{
	#define mid (l+r)/2
	#define lson now*2,l,mid
	#define rson now*2+1,mid+1,r
	int tg[MAXN*4],minn[MAXN*4];
	il void pushup(int now)
	{
		minn[now]=min(minn[now*2],minn[now*2+1]);
	}
	il void pushdown(int now,int l,int r)
	{
		if(tg[now])
		{
			tg[now*2]+=tg[now];
			tg[now*2+1]+=tg[now];
			minn[now*2]+=tg[now];
			minn[now*2+1]+=tg[now];
			tg[now]=0;
		}
	}
	il void build(int now,int l,int r)
	{
		if(l==r)
		{
			minn[now]=a[l];
			return;
		}
		build(lson);
		build(rson);
		pushup(now);
	}
	il void upd(int now,int l,int r,int gl,int gr,int val)
	{
		if(gl<=l&&r<=gr)
		{
			minn[now]+=val;
			tg[now]+=val;
			return;
		}
		pushdown(now,l,r);
		if(gl<=mid)upd(lson,gl,gr,val);
		if(gr>mid)upd(rson,gl,gr,val);
		pushup(now);
	}
	il int query(int now,int l,int r,int gl,int gr)
	{
		if(gl<=l&&r<=gr)return minn[now];
		int ans=2e9;
		pushdown(now,l,r);
		if(gl<=mid)ans=min(query(lson,gl,gr),ans);
		if(gr>mid)ans=min(query(rson,gl,gr),ans);
		return ans;
	}
}tr;
int main()
{
	cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>p[i];
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		if(a[i])
		{
			bl[++cnt]=p[i];
			id[cnt]=i;
		}
	}
	int flag=0;
	for(int i=1;i<=n;i++)if(!a[i])
	{
		flag=1;
		cout<<"NO\n";
		break;
	}
	if(!flag)cout<<"YES\n";
	tr.build(1,1,n);
	for(int i=1;i<=q;i++)
	{
		int op,x,y;
		cin>>op;
		if(op==1)
		{
			cin>>x>>y;
			int l=id[lower_bound(bl+1,bl+1+cnt,x)-bl];
			int r=id[upper_bound(bl+1,bl+1+cnt,y)-bl-1];
			opt[i]=pir(l,r);
			tr.upd(1,1,n,l,r,1);
		}
		else
		{
			cin>>x;
			int l=opt[x].fs,r=opt[x].sc;
			tr.upd(1,1,n,l,r,-1);
		}
		if(tr.minn[1]>=1)cout<<"YES\n";
		else cout<<"NO\n";
	}
}
2022/10/11 20:32
加载中...