#include <bits/stdc++.h>
using namespace std;
struct pop{
int l3,l1,l2,mx;
}a[4000005];
int M=-1e9;
int b[1000005];
int m,n;
int c,d,e;
void biu(int u,int l,int r){
if(l==r){
a[u].mx=b[l];
return;
}
int mid=(l+r)/2;
biu(u*2,l,mid);
biu(u*2+1,mid+1,r);
a[u].mx=max(a[u*2].mx,a[u*2+1].mx);
}
void pd(int u){
if(a[u].l2){
a[u*2].mx=a[u].l1;
a[u*2].l1=a[u*2].l1;
a[u*2+1].mx=a[u].l1;
a[u*2+1].l1=a[u*2].l1;
a[u].l2=0;
a[u*2].l2=1;
a[u*2+1].l2=1;
}
a[u*2].mx+=a[u].l3;
a[u*2+1].mx+=a[u].l3;
a[u*2].l3+=a[u].l3;
a[u*2+1].l3+=a[u].l3;
a[u].l3=0,a[u].l1=0;
}
void kp(int u,int l,int r,int L,int R,int j){
if(L<=l&&r<=R){
a[u].mx=j;
a[u].l1=j;
a[u].l2=1;
a[u].l3=0;
return;
}
if(l>R||r<L) return;
pd(u);
int mid=(l+r)/2;
kp(u*2,l,mid,L,R,j);
kp(u*2+1,mid+1,r,L,R,j);
a[u].mx=max(a[u*2].mx,a[u*2+1].mx );
}
void apc(int u,int l,int r,int L,int R,int j){
if(L<=l&&r<=R){
a[u].mx+=j;
a[u].l3+=j;
return;
}
if(l>R||r<L) return;
pd(u);
int mid=(l+r)/2;
kp(u*2,l,mid,L,R,j);
kp(u*2+1,mid+1,r,L,R,j);
a[u].mx=max(a[u*2].mx,a[u*2+1].mx );
}
int ask(int u,int l,int r,int L,int R){
if(L<=l&&r<=R){
return a[u].mx;
}
if(L>r||R<l){
return M;
}
pd(u);
int mid=(l+r)/2;
return max(ask(u*2,l,mid,L,R),ask(u*2+1,mid+1,r,L,R));
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>b[i];
}
biu(1,1,n);
while(m--){
int k;
cin>>c>>d>>e;
if(c==1){
cin>>k;
kp(1,1,n,d,e,k);
}else if(c==2){
cin>>k;
apc(1,1,n,d,e,k);
}else{
cout<<ask(1,1,n,d,e)<<endl;
}
}
return 0;
}
题目传送门