救救孩子吧!60pts WA on#7 #8 #9 TLE on#10
查看原帖
救救孩子吧!60pts WA on#7 #8 #9 TLE on#10
613526
LDY_楼主2024/7/21 12:22
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3f
#define int long long
using namespace std;
int n,q;
int a[2000005];
struct Tree{
	int l,r,siz;
	int ad,cov;
	int maxx;
}t[8000005];
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
void pushup(int x){
	t[x].maxx=max(t[ls(x)].maxx,t[rs(x)].maxx);
}
void build(int x,int l,int r){
	t[x].l=l;t[x].r=r;t[x].siz=r-l+1;
	t[x].ad=0;t[x].cov=-inf;
	if(l==r){
		t[x].maxx=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(ls(x),l,mid);
	build(rs(x),mid+1,r);
	pushup(x);
}
void pushdown(int x){
	if(t[x].cov!=-inf){
		t[ls(x)].cov=t[x].cov;
	    t[rs(x)].cov=t[x].cov;
	    t[ls(x)].ad=t[x].ad;
	    t[rs(x)].ad=t[x].ad;
	    t[ls(x)].maxx=t[x].ad+t[x].cov;
	    t[ls(x)].maxx=t[x].ad+t[x].cov;
	}
	else{
		t[ls(x)].ad+=t[x].ad;
	    t[rs(x)].ad+=t[x].ad;
	    t[ls(x)].maxx+=t[x].ad;
	    t[rs(x)].maxx+=t[x].ad;
	}
	
	t[x].cov=-inf;t[x].ad=0;
}
void add(int x,int ll,int rr,int k){
	if(t[x].l>rr||t[x].r<ll) return;
	if(t[x].l>=ll&&t[x].r<=rr){
		t[x].ad+=k;
		t[x].maxx+=k;
		return;
	}
	pushdown(x);
	add(ls(x),ll,rr,k);
	add(rs(x),ll,rr,k);
	pushup(x);
}
void cover(int x,int ll,int rr,int k){
	if(t[x].l>rr||t[x].r<ll) return;
	if(t[x].l>=ll&&t[x].r<=rr){
		t[x].ad=0;
		t[x].cov=k;
		t[x].maxx=k;
		return;
	}
	pushdown(x);
	cover(ls(x),ll,rr,k);
	cover(rs(x),ll,rr,k);
	pushup(x);
}
int query(int x,int ll,int rr){
	if(t[x].l>rr||t[x].r<ll) return -inf;
	if(t[x].l>=ll&&t[x].r<=rr) return t[x].maxx;
	pushdown(x);
	return max(query(ls(x),ll,rr),query(rs(x),ll,rr));
}
signed main(){
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	int opt,l,r,x;
	while(q--){
		scanf("%lld",&opt);
		if(opt==1){
			scanf("%lld%lld%lld",&l,&r,&x);
			cover(1,l,r,x);
		}
		if(opt==2){
			scanf("%lld%lld%lld",&l,&r,&x);
			add(1,l,r,x);
		}
		if(opt==3){
			scanf("%lld%lld",&l,&r);
			cout<<query(1,l,r)<<endl;
		}
	}
	return 0;
}
2024/7/21 12:22
加载中...