# include <bits/stdc++.h>
# define NO 0x3f3f3f3f
# define long long int
using namespace std;
const int maxn = 1000009;
int n, m ,kk, op, x,y,mod;
int a[maxn];
struct node{
int l, r, v;
int lazyadd, lazymul;
}tri[4*maxn];
void build(int p, int bl, int br)
{
tri[p].l = bl;
tri[p].r = br;
if(bl==br){
tri[p].v = a[bl];
return;
}
int mid = (bl+br)/2;
build(p<<1, bl, mid);
build(p<<1|1, mid+1, br);
tri[p].v = max(tri[p<<1].v , tri[p<<1|1].v);
}
void pushdown(int p){
if(tri[p].lazymul!=NO){
tri[p<<1].v = tri[p].lazymul;
tri[p<<1|1].v = tri[p].lazymul;
tri[p<<1].lazymul = tri[p].lazymul;
tri[p<<1|1].lazymul = tri[p].lazymul;
tri[p<<1].lazyadd = 0;
tri[p<<1|1].lazyadd = 0;
}
tri[p<<1].v +=tri[p].lazyadd;
tri[p<<1|1].v+=tri[p].lazyadd;
tri[p<<1].lazyadd+=tri[p].lazyadd;
tri[p<<1|1].lazyadd+=tri[p].lazyadd;
tri[p].lazyadd = 0;
tri[p].lazymul = NO;
}
void update_mul(int p, int bl, int br, int k)
{
if(bl<=tri[p].l&&br>=tri[p].r){
tri[p].v = k;
//cout<<tri[p].l<<" to "<<tri[p].r<<" is edited to "<<k<<endl;
tri[p].lazyadd = 0;
tri[p].lazymul =k;
return;
}
int mid = (tri[p].l+tri[p].r)/2;
pushdown(p);
if(br<=mid)
update_mul(p<<1, bl, br, k);
else if(bl>=mid+1)
update_mul(p<<1|1, bl, br, k);
else{
update_mul(p<<1, bl, br, k);
update_mul(p<<1|1, bl, br, k);
}
tri[p].v = max(tri[p<<1].v, tri[p<<1|1].v);
}
void update_add(int p, int bl, int br, int k)
{
if(bl<=tri[p].l&&br>=tri[p].r){
tri[p].v += k;
tri[p].lazyadd +=k;
return;
}
int mid = (tri[p].l+tri[p].r)/2;
pushdown(p);
if(br<=mid)
update_add(p<<1, bl, br, k);
else if(bl>=mid+1)
update_add(p<<1|1, bl, br, k);
else{
update_add(p<<1, bl, br, k);
update_add(p<<1|1, bl, br, k);
}
tri[p].v = max(tri[p<<1].v, tri[p<<1|1].v);
}
int query(int p, int ql, int qr)
{
if(tri[p].l>=ql && tri[p].r<=qr)
return tri[p].v;
int mid = (tri[p].l+tri[p].r)/2;
pushdown(p);
if(mid>=qr)return query(p<<1, ql, qr);
else if(mid+1<=ql)return query(p<<1|1, ql, qr);
else return max(query(p<<1|1, ql, qr),query(p<<1, ql, qr));
}
signed main(void)
{
for(int i = 1; i<=4*maxn; i++)
tri[i].lazymul =NO;
cin>>n>>m;
for(int i = 1; i<=n; i++)
cin>>a[i];
build(1,1,n);
for(int i = 1; i<=m; i++)
{
cin>>op;
if(op==1)
{
cin>>x>>y>>kk;
update_mul(1, x, y, kk);
}
if(op==2)
{
cin>>x>>y>>kk;
update_add(1,x, y,kk);
}
if(op==3)
{
cin>>x>>y;
int t = query(1,x, y);
cout<<t<<endl;
}
}
return 0;
}
6-9wa 10tle