10pts 求调
#include<bits/stdc++.h>
#define ll long long
#define lc x*2
#define rc x*2+1
using namespace std;
struct node{
ll l,r,mx,la2,la1;
}t[500005*4];
ll n,q,a[1000005],op,x,y,z;
void build(int x,int l,int r){
t[x].l=l,t[x].r=r,t[x].mx=-1e18;
if(l==r){
t[x].mx=a[l];
return;
}
ll mid=(l+r)/2;
build(lc,l,mid);
build(rc,mid+1,r);
t[x].mx=max(t[lc].mx,t[rc].mx);
}
void down(int x){
if(t[x].la1){
t[lc].la2=t[rc].la2=0;
t[lc].la1=t[rc].la1=t[x].la1;
t[lc].mx=t[rc].mx=t[x].la1;
t[x].la1=0;
}
if(t[x].la2){
t[lc].la2+=t[x].la2;
t[lc].mx+=t[x].la2;
t[rc].la2+=t[x].la2;
t[rc].mx+=t[x].la2;
t[x].la2=0;
}
}
void cxa(int x,int l,int r,ll k){
if(t[x].l>=l&&t[x].r<=r){
t[x].mx+=k;
t[x].la1+=k;
return;
}
down(x);
ll mid=(t[x].l+t[x].r)/2;
if(l<=mid) cxa(lc,l,r,k);
if(r>mid) cxa(rc,l,r,k);
t[x].mx=max(t[lc].mx,t[rc].mx);
}
void tihu(int x,int l,int r,ll k){
if(t[x].l>=l&&t[x].r<=r){
t[x].mx=k;
t[x].la2=k;
t[x].la1=0;
return;
}
down(x);
ll mid=(t[x].l+t[x].r)/2;
if(l<=mid) tihu(lc,l,r,k);
if(r>mid) tihu(rc,l,r,k);
t[x].mx=max(t[lc].mx,t[rc].mx);
}
ll ma(int x,int l,int r){
ll ans=-1e18;
if(t[x].l>=l&&t[x].r<=r)
return t[x].mx;
down(x);
ll mid=(t[x].l+t[x].r)/2;
if(l<=mid) ans=max(ans,ma(lc,l,r));
if(r>mid) ans=max(ans,ma(rc,l,r));
return ans;
}
int main(){
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(q--){
cin>>op>>x>>y;
if(op==1){
cin>>z;
cxa(1,x,y,z);
}
if(op==2){
cin>>z;
tihu(1,x,y,z);
}
if(op==3)
cout<<ma(1,x,y)<<"\n";
}
return 0;
}
悬关