mxqz恶臭线段树(悬关)
查看原帖
mxqz恶臭线段树(悬关)
324666
diqiuyi奶龙楼主2023/4/13 13:54

rt,后两个 subtask WA 了

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,q,opt,l,r;
ll x,a[1000005],lazy[4000005],lt[4000005],rt[4000005];
bitset<4000005> bt;
void Add(int p,int l1,int r1,int l2,int r2,ll x){
	if(l2<=l1&&r1<=r2){
		lazy[p]+=x,lt[p]+=x,rt[p]+=x;
		return ;
	}
	int mid=l1+r1>>1;
	if(l2<=mid) Add(p<<1,l1,mid,l2,r2,x);
	if(r2>mid) Add(p<<1|1,mid+1,r1,l2,r2,x);
	bt[p]=(bt[p<<1]&&bt[p<<1|1]&&rt[p<<1]<=lt[p<<1|1]),
	lt[p]=lt[p<<1],rt[p]=rt[p<<1|1];
}
bool query(int p,int l1,int r1,int l2,int r2){
	if(l2<=l1&&r1<=r2)
		return bt[p];
	int mid=l1+r1>>1;
	if(lazy[p]) lazy[p<<1]+=lazy[p],lazy[p<<1|1]+=lazy[p],
	lt[p<<1]+=lazy[p],rt[p<<1]+=lazy[p],lt[p<<1|1]+=lazy[p],rt[p<<1|1]+=lazy[p],lazy[p]=0;
	if(mid>=r2) return query(p<<1,l1,mid,l2,r2);
	if(mid<l2) return query(p<<1|1,mid+1,r1,l2,r2);
	return query(p<<1,l1,mid,l2,r2)&&query(p<<1|1,mid+1,r1,l2,r2)&&rt[p<<1]<=lt[p<<1|1];
}
void build(int p,int l1,int r1){
	lt[p]=a[l1],rt[p]=a[r1];
	if(l1==r1){
		bt[p]=1;
		return ;
	}
	int mid=l1+r1>>1;
	build(p<<1,l1,mid);
	build(p<<1|1,mid+1,r1);
	if(bt[p<<1]&&bt[p<<1|1]&&rt[p<<1]<=lt[p<<1|1]) bt[p]=1;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build(1,1,n);
	while(q--){
		cin>>opt>>l>>r;
		if(r==n+1) r=n;
		if(opt==1) cin>>x,Add(1,1,n,l,r,x);
		else if(query(1,1,n,l,r)) cout<<"Yes\n";
		else cout<<"No\n";
	}
	return 0;
}
2023/4/13 13:54
加载中...