20分求调
查看原帖
20分求调
213141
谁伴我流浪楼主2024/10/9 22:32
#include<bits/stdc++.h>
using namespace std;
struct segmentree{
	long long l,r;
	long long add;
	long long mx;
	long long modify,flag;
	#define l(p) tree[p].l
	#define r(p) tree[p].r
	#define mx(p) tree[p].mx
	#define add(p) tree[p].add
	#define modify(p) tree[p].modify
	#define flag(p) tree[p].flag
}tree[1000000*4+10];
long long a[1000010];
long long n,m;
long long max(long long x,long long y){
	if(x>y) return x;
	else return y;
}
void build(long long p,long long l,long long r){
	l(p)=l,r(p)=r;
	if(l==r){
		mx(p)=a[l];
		return;
	}
	long long mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	mx(p)=max(mx(p<<1),mx(p<<1|1));
}
void spread(long long p){
	if(flag(p)){
		mx(p<<1)=modify(p);
		mx(p<<1|1)=modify(p);
		modify(p<<1)=modify(p);
		modify(p<<1|1)=modify(p);
		add(p<<1)=0;
		add(p<<1|1)=0;
		flag(p<<1|1)=1;
		flag(p<<1)=1;
		flag(p)=0;
	}
	if(add(p)){
		mx(p<<1)+=add(p);
		add(p<<1)+=add(p);
		mx(p<<1|1)+=add(p);
		add(p<<1|1)+=add(p);
		add(p)=0;
	}
}
long long ask(long long p,long long l,long long r){
	if(l<=l(p)&&r>=r(p)){
		return mx(p);
	}
	long long ans=-1e18;
	spread(p);
	long long mid=(l(p)+r(p))>>1;
	if(l<mid) ans=max(ask(p<<1,l,mid),ans);
	if(r>mid) ans=max(ask(p<<1|1,mid+1,r),ans);
	return ans;
}
void change1(long long p,long long l,long long r,long long d){
	if(l<=l(p)&&r>=r(p)){
		mx(p)=d;
		modify(p)=d;
		add(p)=0;
		flag(p)=1;
		return;
	}
	spread(p);
	long long mid=(l(p)+r(p))>>1;
	if(l<mid) change1(p<<1,l,mid,d);
	if(r>mid) change1(p<<1|1,mid+1,r,d);
	mx(p)=max(mx(p<<1),mx(p<<1|1));
}
void change2(long long p,long long l,long long r,long long d){
	if(l<=l(p)&&r>=r(p)){
		mx(p)+=d;
		add(p)+=d;
		return;
	}
	spread(p);
	long long mid=(l(p)+r(p))>>1;
	if(l<mid) change2(p<<1,l,mid,d);
	if(r>mid) change2(p<<1|1,mid+1,r,d);
	mx(p)=max(mx(p<<1),mx(p<<1|1));
}
int main(){
	scanf("%lld%lld",&n,&m);
	for(long long i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	build(1,1,n);
	for(long long i=1;i<=m;i++){
		long long op;
		scanf("%lld",&op);
		if(op==1){//替换
			long long x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			change1(1,x,y,k);
		}else if(op==2){//加值 
			long long x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			change2(1,x,y,k);
		}else {
			long long x,y;
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",ask(1,x,y));
		}
	}
	return 0;
}
2024/10/9 22:32
加载中...