50分求助!
查看原帖
50分求助!
515833
tang_mx楼主2023/8/22 19:19

有无大佬帮忙,实在调不出来

#include<iostream>
#include<cstdio>

using namespace std;

const int N=1e6+10;
const long long inf=-1e30;

typedef long long ll;

struct Segment{
	ll l,r,add1,add2,sum,dat;
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define add1(x) tree[x].add1
	#define add2(x) tree[x].add2
	#define dat(x) tree[x].dat
}tree[N*4];

ll n,m,a[N];

void build(ll p,ll l,ll r){
	l(p)=l,r(p)=r;add1(p)=inf;
	if(l==r){
		dat(p)=a[l];
		return ;
	}
	ll mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	dat(p)=max(dat(p<<1),dat(p<<1|1));
}

void spread(ll p){
	if(add1(p)!=inf){
		dat(p<<1)=add1(p);
		dat(p<<1|1)=add1(p);
		add1(p<<1)=add1(p);
		add1(p<<1|1)=add1(p);
		add2(p)=add2(p)=0;
		add1(p)=inf;
	}
	else if(add2(p)){
		dat(p<<1)+=add2(p);
		dat(p<<1|1)+=add2(p);
		add2(p<<1)+=add2(p);
		add2(p<<1|1)+=add2(p);
		add2(p)=0;
	}
}

void change(ll p,ll l,ll r,ll k){
	if(l<=l(p)&&r>=r(p)){
		dat(p)=k;
		add1(p)=k;
		add2(p)=0;
		return ;
	}
	ll mid=(l(p)+r(p))>>1;
	spread(p);
	if(l<=mid)change(p<<1,l,r,k);
	if(r>mid)change(p<<1|1,l,r,k);
	dat(p)=max(dat(p<<1),dat(p<<1|1));
}

void addd(ll p,ll l,ll r,ll k){
	if(l<=l(p)&&r>=r(p)){
		dat(p)+=k;
		if(add1(p)==inf)add2(p)+=k;
		else add1(p)=k;
		return ;
	}
	ll mid=(l(p)+r(p))>>1;
	spread(p);
	if(l<=mid)addd(p<<1,l,r,k);
	if(r>mid)addd(p<<1|1,l,r,k);
	dat(p)=max(dat(p<<1),dat(p<<1|1));
}

ll ask(ll p,ll l,ll r){
	if(l<=l(p)&&r>=r(p))return dat(p);
	spread(p);
	ll mid=(l(p)+r(p))>>1;
	ll ans=-(1<<30);
	if(l<=mid)ans=max(ans,ask(p<<1,l,r));//没写ask 乐了 
	if(r>mid)ans=max(ans,ask(p<<1|1,l,r));
	return ans;
}

int main(){
//	freopen("P1253_6.in","r",stdin);
//	freopen("ans1.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	build(1,1,n);
	ll opt,x,y,k;
	for(int i=1;i<=m;i++){
		scanf("%lld%lld%ld",&opt,&x,&y);
		if(opt==1){
			scanf("%lld",&k);
			change(1,x,y,k);
		}
		else if(opt==2){
			scanf("%lld",&k);
			addd(1,x,y,k);
		}
		else printf("%lld\n",ask(1,x,y));
	}
	return 0;
}
2023/8/22 19:19
加载中...