50分,求助
查看原帖
50分,求助
546831
leozty楼主2022/8/6 16:10
#include <bits/stdc++.h>
using namespace std;
long long maxv[50000010],a[10000010];
long long lazy[50000010];
long long lazy1[50000010];
long long n,q;
void pushdown1(long long id){
	if(lazy[id]!=-1145141919810){
		lazy[id*2]=lazy[id];
		lazy[id*2+1]=lazy[id];
		maxv[id*2]=lazy[id];
		maxv[id*2+1]=lazy[id];
		lazy[id]=-1145141919810;
	}
	if(lazy1[id]){
		lazy1[id*2]+=lazy1[id];
		lazy1[id*2+1]+=lazy1[id];
		maxv[id*2]+=lazy1[id];
		maxv[id*2+1]+=lazy1[id];
		lazy1[id]=0;
	}
}
void pushdown(long long id){
	lazy1[id]=0;
	lazy1[id*2]=0;
	lazy1[id*2+1]=0;
	pushdown1(id);
}
void update(long long id,long long l,long long r,long long x,long long y,long long v){
	if(x<=l&&y>=r){
		maxv[id]=v;
		lazy[id]=v;
		return;
	}
	pushdown(id);
	long long mid=(l+r)/2;
	if(x<=mid){
		update(id*2,l,mid,x,y,v);
	}
	if(y>mid){
		update(id*2+1,mid+1,r,x,y,v);
	}
	maxv[id]=max(maxv[id*2],maxv[id*2+1]);
}
void update1(long long id,long long l,long long r,long long x,long long y,long long v){
	if(x<=l&&y>=r){
		maxv[id]+=v;
		lazy1[id]+=v;
		return;
	}
	pushdown1(id);
	long long mid=(l+r)/2;
	if(x<=mid){
		update1(id*2,l,mid,x,y,v);
	}
	if(y>mid){
		update1(id*2+1,mid+1,r,x,y,v);
	}
	maxv[id]=max(maxv[id*2],maxv[id*2+1]);
}
long long question(long long id,long long l,long long r,long long x,long long y){
	if(x<=l&&y>=r){
		return maxv[id];
	}
	pushdown1(id);
	long long mid=(l+r)/2;
	long long temp1=0,temp2=0;
	if(x<=mid){
		temp1=question(id*2,l,mid,x,y);
	}
	if(y>mid){
		temp2=question(id*2+1,mid+1,r,x,y);
	}
	return max(temp1,temp2);
}
int main(){
	cin>>n;
	cin>>q;
	for(long long i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		update(1,1,n,i,i,a[i]);
	}
	for(long long i=1;i<=40000005;i++){
		lazy[i]=-1145141919810;
	}
	for(long long i=1;i<=q;i++){
		int op;
		cin>>op;
		long long l,r;
		long long x;
		if(op==1){
			scanf("%lld %lld %lld",&l,&r,&x);
			update(1,1,n,l,r,x);
		}
		if(op==2){
			scanf("%lld %lld %lld",&l,&r,&x);
			update1(1,1,n,l,r,x);
		}
		if(op==3){
			scanf("%lld %lld",&l,&r);
			long long ans=question(1,1,n,l,r);
            printf("%lld\n",ans);
		}
	}
	return 0;
}
2022/8/6 16:10
加载中...