Lemon_City @ 2023-07-28 10:45:19
#include<iostream>
long long max(long long a,long long b){
return (a>b)?a:b;
}
using namespace std;
const int N=1e6+10;
#define Inf 100000000000ll
long long lzys[4*N],lzya[4*N],a[N],w[4*N];
void pushup(int u){
w[u]=max(w[(u<<1)],w[(u<<1)+1]);
}
void build(int u,int l,int r){
if(l==r){
w[u]=a[l];
return ;
}
int mid=(l+r)>>1;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u);
}
bool InRange(int L,int R,int l,int r){
return (L>=l)&&(R<=r);
}
bool OutRange(int L,int R,int l,int r){
return (L>r)||(R<l);
}
void maketags(int u,int x){
w[u]=x;
lzya[u]=0;
lzys[u]=x;
}
void maketaga(int u,int x){
w[u]+=x;
(lzys[u]==Inf)?lzya[u]+=x:lzys[u]+=x;
}
void pushdown(int u){
if(lzys[u]==Inf){
maketaga(u*2,lzya[u]);
maketaga(u*2+1,lzya[u]);
lzya[u]=0;
}else{
maketags(u*2,lzys[u]);
maketags(u*2+1,lzys[u]);
lzys[u]=Inf;
}
}
void updatea(int u,int L,int R,int l,int r,int x){
if(InRange(L,R,l,r)){
maketaga(u,x);
}else if(!OutRange(L,R,l,r)){
int mid=(L+R)>>1;
pushdown(u);
updatea(u*2,L,mid,l,r,x);
updatea(u*2+1,mid+1,R,l,r,x);
pushup(u);
}else return;
}
void updates(int u,int L,int R,int l,int r,int x){
if(InRange(L,R,l,r)){
maketags(u,x);
}else if(!OutRange(L,R,l,r)){
int mid=(L+R)>>1;
pushdown(u);
updates(u*2,L,mid,l,r,x);
updates(u*2+1,mid+1,R,l,r,x);
pushup(u);
}else return;
}
long long query(int u,int L,int R,int l,int r){
if(InRange(L,R,l,r)){
return w[u];
}else if(!OutRange(L,R,l,r)){
int mid=(L+R)>>1;
pushdown(u);
return max(query(u*2,L,mid,l,r),query(u*2+1,mid+1,R,l,r));
}else return -Inf;
}
int main(){
int n,q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){scanf("%lld",&a[i]);}
for(int i=1;i<=4*n;i++){lzys[i]=Inf;}
build(1,1,n);
for(int i=1;i<=q;i++){
long long opt,l,r,x;
scanf("%lld",&opt);
if(opt==1){
scanf("%lld%lld%lld",&l,&r,&x);
updates(1,1,n,l,r,x);
}else if(opt==2){
scanf("%lld%lld%lld",&l,&r,&x);
updatea(1,1,n,l,r,x);
}else{
scanf("%lld%lld",&l,&r);
printf("%lld\n",query(1,1,n,l,r));
}
}
return 0;
}