60分 WAon7、8、9、10
#include<bits/stdc++.h>
#define N 1000005
#define int long long
#define gc getchar()
using namespace std;
int sum[N*4],lazy1[N*4],n,m,a[N*4],b,x2,y2,k2,lazy2[N*4],vis[N*4];
inline int read()
{
int x=0,ss=1;
char s=gc;
while(!isdigit(s)&&s!='-')s=gc;
if(s=='-')ss*=-1,s=gc;
while(isdigit(s))x=(x<<1)+(x<<3)+s-'0',s=gc;
return ss*x;
}
void pushup(int k){
sum[k]=max(sum[k<<1],sum[k<<1|1]);
}
void add(int k,int x){
sum[k]+=x;
lazy1[k]+=x;
}
void revise(int k,int x){
sum[k]=x;
lazy1[k]=0;
lazy2[k]=x;
vis[k]=1;
}
void pushdown_1(int k){
if(lazy1[k]==0){
return;
}
add(k<<1,lazy1[k]);
add(k<<1|1,lazy1[k]);
lazy1[k]=0;
}
void pushdown_2(int k){
if(vis[k]==0){
return;
}
revise(k<<1,lazy2[k]);
revise(k<<1|1,lazy2[k]);
vis[k]=0,lazy1[k]=0,lazy2[k]=0;
}
void build(int k,int l,int r){
if(l==r){
sum[k]=a[l];
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pushup(k);
}
void modify(int k,int l,int r,int x,int y,int v){
if(r<x||l>y) return;
if(x<=l&&r<=y){
add(k,v);
return;
}
int mid=(l+r)>>1;
pushdown_2(k);
pushdown_1(k);
modify(k<<1,l,mid,x,y,v);
modify(k<<1|1,mid+1,r,x,y,v);
pushup(k);
}
void change(int k,int l,int r,int x,int y,int v){
if(r<x||l>y) return;
if(x<=l&&r<=y){
revise(k,v);
return;
}
int mid=(l+r)>>1;
pushdown_2(k);
pushdown_1(k);
change(k<<1,l,mid,x,y,v);
change(k<<1|1,mid+1,r,x,y,v);
lazy1[k]=0;
pushup(k);
}
int query(int k,int l,int r,int x,int y){
if(x<=l&&r<=y){
return sum[k];
}
pushdown_2(k);
pushdown_1(k);
int mid=(l+r)>>1,ans=LONG_LONG_MIN;
if(x<=mid) ans=max(ans,query(k<<1,l,mid,x,y));
if(y>mid) ans=max(ans,query(k<<1|1,mid+1,r,x,y));
pushup(k);
return ans;
}
signed main()
{
/*
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
*/
n=read(),m=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
// cout<<i<<" "<<endl;
}
build(1,1,n);
// cout<<sum[1];
for(int i=1;i<=m;i++)
{
b=read();
if(b==1)
{
x2=read(),y2=read(),k2=read();
change(1,1,n,x2,y2,k2);
}
else if(b==2)
{
x2=read(),y2=read(),k2=read();
modify(1,1,n,x2,y2,k2);
}
else{
x2=read(),y2=read();
cout<<query(1,1,n,x2,y2)<<endl;
}
}
return 0;
}