better_Z @ 2024-04-13 21:33:31
#include<iostream>
#include<cmath>
using namespace std;
#define maxn 1000010
#define ll long long
#define inf 1000000000ll
ll w[maxn*4],lzy_add[maxn*4],lzy_set[maxn*4],a[maxn];
int ans;
void pushup(int u){w[u]=max(w[u*2],w[u*2+1]);}
void build(int u,int l,int r){
if(l==r){
w[l]=a[l];
}
int m=(l+r)>>1;
build(u*2,l,m);build(u*2+1,m+1,r);
lzy_set[u]=inf;
pushup(u);
}
void maketag(int u,ll x,int type){
if(type==1){
lzy_add[u]=0;lzy_set[u]=x;w[u]=x;
}
else{
if(lzy_set[u]==inf)lzy_add[u]+=x;
else lzy_set[u]+=x;
w[u]+=x;
}
}
void pushdown(int u){
if(lzy_set[u]==inf){
maketag(u*2,lzy_add[u],2);
maketag(u*2+1,lzy_add[u],2);
lzy_add[u]=0;
}
else{
maketag(u*2,lzy_set[u],1);
maketag(u*2+1,lzy_set[u],1);
lzy_set[u]=inf;
}
}
void update(int u,int ql,int qr,int l,int r,ll x,int type){
if(ql>=l&&r>=qr)maketag(u,x,type);
pushdown(u);
int m=(l+r)>>1;
if(l<=m)update(u*2,ql,m,l,r,x,type);
if(r>=m)update(u*2+1,m+1,qr,l,r,x,type);
pushup(u);
}
ll query(int u,int ql,int qr,int l,int r){
if(ql>=l&&r>=qr)return w[u];
pushdown(u);
int m=(l+r)>>1;
if(l<=m)ans=max(static_cast<long long>(ans),static_cast<long long>(query(u*2,ql,m,l,r)));
if(r>=m)ans=max(static_cast<long long>(ans),static_cast<long long>(query(u*2+1,m+1,qr,l,r)));
return ans;
}
int main(){
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
for(int i=1,op;i<=q;i++){
int l,r,x;
cin>>op;
if(op==1){
cin>>l>>r>>x;
update(1,1,n,l,r,x,1);
}else if(op==2){
cin>>l>>r>>x;
update(1,1,n,l,r,x,2);
}else{
cin>>l>>r;
cout<<query(1,1,n,l,r);
cout<<endl;
}
}
return 0;
}