50分求调
查看原帖
50分求调
754516
MSN_04楼主2024/5/3 17:13
#include<bits/stdc++.h>
#define ll long long
#define int long long
#define pd  tr[p]=max(tr[p*2],tr[p*2+1])
using namespace std;
const int N=1e6+9,in=-1e10;
ll n,m,a[N];
ll tr[N*4],b[N*4],c[N*4];
void build(ll p,ll l,ll r){
	c[p]=in;
	if(r==l){
		tr[p]=a[l];
		return ;
	}
	ll mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	tr[p]=max(tr[p*2],tr[p*2+1]);
}
void lanb(ll p){
	if(c[p]!=in){
		b[p*2]=b[p*2+1]=0;
		tr[p*2]=tr[p*2+1]=c[p];
		c[p]=in;
	}
	if(b[p]>0){
		tr[p*2]+=b[p],b[p*2]+=b[p];
		tr[p*2+1]+=b[p],b[p*2+1]+=b[p];
		b[p]=0;
	}
}
void change(ll p,ll l,ll r,ll xl,ll xr ,ll k){
	if(xl<=l&&r<=xr){
		tr[p]+=k;
		b[p]+=k;
		return ;
	}
	lanb(p);
	ll mid=(l+r)/2;
	if(xl<=mid) change(p*2,l,mid,xl,xr,k);
	if(xr>mid) change(p*2+1,mid+1,r,xl,xr,k); 
	pd;
}
void change1(ll p,ll l,ll r,ll xl,ll xr ,ll k){
	if(xl<=l&&r<=xr){
		tr[p]=c[p]=k;
		b[p]=0;
		return ;
	}
	lanb(p);
	ll mid=(l+r)/2;
	if(xl<=mid) change1(p*2,l,mid,xl,xr,k);
	if(xr>mid) change1(p*2+1,mid+1,r,xl,xr,k);
	pd; 
}
int ask(ll p,ll l,ll r,ll xl,ll xr){
    if(xl<=l&&r<=xr) return tr[p];
	lanb(p);
	ll ans=in;
	ll mid=(l+r)/2;
	if(xl<=mid) ans=max(ans,ask(p*2,l,mid,xl,xr));
	if(xr>mid) ans=max(ans,ask(p*2+1,mid+1,r,xl,xr));
	return ans;
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	while(m--){
		ll op,l,r,k;
		cin>>op>>l>>r;
		if(op==1){
			cin>>k;
			change1(1,1,n,l,r,k);
		}
		if(op==2){
			cin>>k;
			change(1,1,n,l,r,k);
		}
		if(op==3){
			cout<<ask(1,1,n,l,r)<<endl;
		}
	}
}
2024/5/3 17:13
加载中...