60分TLE求助
查看原帖
60分TLE求助
745265
RJtc0513楼主2023/2/2 13:17
#define int long long
using namespace std;
int n,T;
int a[10000010],laz[10000010];
struct node {
	int l,r,lw,rw;
	bool f;
} e[10000010];
void renewans(node &x,node y,node z) {
	x.lw=y.lw;
	x.rw=z.rw;
	if(y.f&&z.f&&y.rw<=z.lw) {
		x.f=1;
	} else {
		x.f=0;
	}
	return;
}
void merge(int i) {
	e[i].lw=e[i*2].lw;
	e[i].rw=e[i*2+1].rw;
	if(e[i*2].rw<=e[i*2+1].lw&&e[i*2].f&&e[i*2+1].f) {
		e[i].f=1;
	} else {
		e[i].f=0;
	}
	return;
}
void pushup(int i,int w) {
	e[i].lw+=w;
	e[i].rw+=w;
	laz[i]+=w;
	return;
}
void pushdown(int i) {
	if(e[i].l==e[i].r) {
		return;
	}
	pushup(i*2,laz[i]);
	pushup(i*2+1,laz[i]);
	laz[i]=0;
	return;
}
void build(int i,int l,int r) {
	e[i].l=l;
	e[i].r=r;
	if(l==r) {
		e[i].lw=e[i].rw=a[l];
		e[i].f=1;
		return;
	}
	build(i*2,l,(l+r)/2);
	build(i*2+1,(l+r)/2+1,r);
	merge(i);
	return;
}
void update(int i,int l,int r,int w) {
	if(e[i].l>=l&&e[i].r<=r) {
		pushup(i,w);
		return;
	}
	pushdown(i);
	int mid=(e[i].l+e[i].r)/2;
	if(mid>=l) {
		update(i*2,l,r,w);
	}
	if(mid<r) {
		update(i*2+1,l,r,w);
	}
	merge(i);
	return;
}
node query(int i,int l,int r) {
	if(e[i].l>=l&&e[i].r<=r) {
		return e[i];
	}
	pushdown(i);
	node ans,a1,a2;
	int mid=(e[i].l+e[i].r)/2;
	if(mid>=r) {
		return query(i*2,l,r);
	} else if(mid<l) {
		return query(i*2+1,l,r);
	} else {
		a1=query(i*2,l,mid);
		a2=query(i*2+1,mid+1,r);
		renewans(ans,a1,a2);
	}
	return ans;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(),cout.tie();
	cin>>n>>T;
	for(int i=1; i<=n; i++) {
		cin>>a[i];
	}
	build(1,1,n);
	while(T--) {
		int op,l,r,w;
		cin>>op;
		if(op==1) {
			cin>>l>>r>>w;
			update(1,l,r,w);
		} else {
			cin>>l>>r;
			cout<<(query(1,l,r).f?"Yes\n":"No\n");
		}
	}
	return 0;
}```
2023/2/2 13:17
加载中...