7-10wa
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstdlib>
#include<string>
#include<cstring>
#include<set>
#include<vector>
#include<utility>
#include<stack>
#include<list>
#include<queue>
#include<climits>
#include<tuple>
using namespace std;
#define int long long
#define pii pair<int,int>
#define l(x) x&(-x)
#define lch 2*now
#define rch 2*now+1
#define mid (p[now].r+p[now].l>>1)
int ai[1000010];
struct tree{
int sum,l,r,add,upd;
}p[8000010];
void push_up(int now){p[now].sum=max(p[lch].sum,p[rch].sum);}
void push_down(int now){
p[lch].sum=(p[now].upd==1145141919810ll?p[lch].sum:p[now].upd)+p[now].add;
p[rch].sum=(p[now].upd==1145141919810ll?p[rch].sum:p[now].upd)+p[now].add;
p[lch].add+=p[now].add;
p[rch].add+=p[now].add;
if(p[now].upd!=1145141919810ll)p[lch].upd=p[rch].upd=p[now].upd;
p[now].add=0;p[now].upd=1145141919810ll;
}
void build(int now,int l,int r){
if(p[now]={ai[l],l,r,0,1145141919810ll},l==r)return;
build(2*now,l,mid);build(2*now+1,mid+1,r);push_up(now);
}
void update(int o,int now,int l,int r,int t){
if(p[now].l>=l&&r>=p[now].r){
if(o==1){
p[now].sum=t;
if(p[now].add!=0)p[now].add=0;
p[now].upd=t;
}else{
p[now].sum+=t;
p[now].add+=t;
}
return;
}
push_down(now);
if(l<=mid)update(o,lch,l,r,t);if(r>mid)update(o,rch,l,r,t);
push_up(now);
}
int query(int now,int l,int r){
push_down(now);
if(p[now].l>=l&&r>=p[now].r)return p[now].sum;
int ans=LLONG_MIN;
push_up(now);
if(l<=mid)ans=max(ans,query(lch,l,r));if(r>mid)ans=max(ans,query(rch,l,r));
return ans;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n>>m;
for(int x=1;x<=n;x++){
cin>>ai[x];
}build(1,1,n);
for(int x=1;x<=m;x++){
int o,a,b,c;
cin>>o>>a>>b;
if(o!=3){
cin>>c;
update(o,1,a,b,c);
} else cout<<query(1,a,b)<<endl;
}
return 0;
}