CLX_brunch @ 2024-07-29 19:28:16
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,a[5000010],x,y,z,www,b[5000010],q[5000010],d[5000010];
void push1(ll x){
if(b[x]){
d[x*2]+=b[x];
d[x*2+1]+=b[x];
b[x*2]+=b[x];
b[x*2+1]+=b[x];
b[x]=0;
}
}
void push2(ll x){
if(q[x]!=LONG_LONG_MAX){
d[x*2]=d[x*2+1]=q[x];
q[x*2]=q[x*2+1]=q[x];
b[x*2]=b[x*2+1]=0;
q[x]=LONG_LONG_MAX;
}
}
void build(ll s,ll t,ll p){
if(s==t){
d[p]=a[s];
return ;
}
ll m=(t-s)/2+s;
build(s,m,p*2);
build(m+1,t,p*2+1);
d[p]=max(d[p*2],d[p*2+1]);
return ;
}
void change1(ll l,ll r,ll c,ll s,ll t,ll p){
if(l<=s&&r>=t){
d[p]+=c;
b[p]+=c;
return ;
}
push2(p);
push1(p);
ll m=(t-s)/2+s;
if(l<=m) change1(l,r,c,s,m,p*2);
if(r>m) change1(l,r,c,m+1,t,p*2+1);
d[p]=max(d[p*2],d[p*2+1]);
}
void change2(ll l,ll r,ll c,ll s,ll t,ll p){
if(l<=s&&r>=t){
d[p]=q[p]=c;
b[p]=0;
return ;
}
ll m=(t-s)/2+s;
push2(p);
push1(p);
if(l<=m) change2(l,r,c,s,m,p*2);
if(r>m) change2(l,r,c,m+1,t,p*2+1);
d[p]=max(d[p*2],d[p*2+1]);
}
ll getmax(ll l,ll r,ll s,ll t,ll p){
if(l<=s&&r>=t){
return d[p];
}
ll m=(t-s)/2+s,sum=LONG_LONG_MIN;
push2(p);
push1(p);
if(l<=m) sum=max(sum,getmax(l,r,s,m,p*2));
if(r>m) sum=max(sum,getmax(l,r,m+1,t,p*2+1));
return sum;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,n,1);
for(int i=1;i<=m;i++){
cin>>www;
if(www==1){
cin>>x>>y>>z;
change2(x,y,z,1,n,1);
}
if(www==2){
cin>>x>>y>>z;
change1(x,y,z,1,n,1);
}
if(www==3){
cin>>x>>y;
cout<<getmax(x,y,1,n,1)<<endl;
}
}
return 0;
}
by CLX_brunch @ 2024-07-30 11:24:38
已过,此贴结