线段树21pts求助
查看原帖
线段树21pts求助
590386
_LX_楼主2023/10/31 11:47
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000005
#define int long long
#define mid ((l+r)>>1)
int a[MAXN],n,k;
struct XDS{
	int l,r,minn,maxn,lzt;
	bool anc;
}xds[MAXN<<2],bz;
inline void XDS_push_down(int x){
	xds[x<<1].lzt+=xds[x].lzt;
	xds[x<<1].minn+=xds[x].lzt;
	xds[x<<1].maxn+=xds[x].lzt;
	xds[(x<<1)+1].lzt+=xds[x].lzt;
	xds[(x<<1)+1].minn+=xds[x].lzt;
	xds[(x<<1)+1].maxn+=xds[x].lzt;
	xds[x].lzt=0;
	return;
}
inline void XDS_merge(int x){
	if(xds[x<<1].anc&&xds[(x<<1)+1].anc&&xds[x<<1].maxn<=xds[(x<<1)+1].minn) xds[x].anc=1;
	else xds[x].anc=0;
	xds[x].minn=xds[x<<1].minn;
	xds[x].maxn=xds[(x<<1)+1].maxn;
	return;
}
inline void XDS_make(int x,int l,int r){
	xds[x].l=l;
	xds[x].r=r;
	if(xds[x].l==xds[x].r){
		xds[x].maxn=xds[x].minn=a[l];
		xds[x].anc=1;
		return;
	}
	XDS_make(x<<1,l,mid);
	XDS_make((x<<1)+1,mid+1,r);
	XDS_merge(x);
}
inline void XDS_add(int x,int l,int r,int z){
	if(xds[x].l>=l&&xds[x].r<=r) xds[x].lzt+=z,xds[x].minn+=z,xds[x].maxn+=z;
	else if(xds[x].r<l||xds[x].l>r) return;
	else{
		XDS_push_down(x);
		XDS_add(x<<1,l,r,z);
		XDS_add((x<<1)+1,l,r,z);
		XDS_merge(x);
	}
	return;
}
inline XDS XDS_search(int x,int l,int r){
	XDS node1=bz,node2=bz;
	if(xds[x].l>=l&&xds[x].r<=r) return xds[x];
	else if(xds[x].r<l||xds[x].l>r) {node1.r=node1.l=-1;return node1;}
	else{
		node1=XDS_search(x<<1,l,r);
		node2=XDS_search((x<<1)+1,l,r);
		if(node1.l==-1) return node2;
		else if(node2.l==-1) return node1;
		else {
			if(node1.anc&&node2.anc&&node1.maxn<=node2.minn) node1.anc=1;
			else node1.anc=0;
			node1.r=node2.r,node1.maxn=node2.maxn;
			return node1;
		}
	}
	return node1;
}
signed main(){
	bz.l=bz.r=bz.anc=bz.maxn=bz.minn=0;
	scanf("%lld%lld",&n,&k);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	XDS_make(1,1,n);
	while(k--){
		int opt,l,r;
		scanf("%lld%lld%lld",&opt,&l,&r);
		if(r>=n+1) r=n;
		if(opt==1){
			int z;
			scanf("%lld",&z);
			XDS_add(1,l,r,z);
		}
		else{
			if(XDS_search(1,l,r).anc) printf("Yes\n");
			else printf("No\n");
		}
	}
	return 0;
}
2023/10/31 11:47
加载中...