#include <bits/stdc++.h>
using namespace std;
const int MAXLENGTH = 1000005;
int N, M;
int a[MAXLENGTH] = {0};
long long d[4 * MAXLENGTH] = {0};
long long b[4 * MAXLENGTH] = {0};
long long e[4 * MAXLENGTH] = {0};
bool flag[4 * MAXLENGTH] = {0};
void build(int s, int t, int p){
if(s==t){
d[p] = a[s];
return;
}
int m = s + ((t - s) >> 1);
build(s, m, 2 * p);
build(m+1, t, 2*p+1);
d[p] = (d[2*p] + d[2*p+1]);
}
void pushdown(int s, int t, int p){
int m = s + ((t - s) >> 1);
if(flag[p] && s != t){
d[2*p] = e[p] + b[p];
d[2*p+1] = e[p] + b[p];
e[2*p] = e[p];
e[2*p+1] = e[p];
b[2*p] = b[p];
b[2*p+1] = b[p];
flag[2*p] = 1;
flag[2*p+1] = 1;
flag[p] = 0;
b[p] = 0;
return;
}
if(b[p] && s != t){
d[2*p] += b[p];
d[2*p+1] += b[p];
b[2*p] += b[p];
b[2*p+1] += b[p];
b[p] = 0;
}
}
void pushup(int p){
d[p] = max(d[2*p], d[2*p+1]);
}
void update_add(int l, int r, int c, int s, int t, int p){
if(l <= s && r >= t){
d[p] += c;
b[p] += c;
return;
}
pushdown(s, t, p);
int m = s + ((t - s) >> 1);
if(l <= m)
update_add(l, r, c, s, m, 2*p);
if(r > m)
update_add(l, r, c, m+1, t, 2*p+1);
pushup(p);
}
void update_rename(int l, int r, int c, int s, int t, int p){
if(l <= s && r >= t){
d[p] = c;
b[p] = 0;
e[p] = c;
flag[p] = 1;
return;
}
pushdown(s, t, p);
int m = s + ((t - s) >> 1);
if(l <= m)
update_rename(l, r, c, s, m, 2*p);
if(r > m)
update_rename(l, r, c, m+1, t, 2*p+1);
pushup(p);
}
long long solve(int l, int r, int s, int t, int p){
if(l <= s && r >= t)
return d[p];
int m = s + ((t - s) >> 1);
pushdown(s, t, p);
long long maxi = 1<<31;
if(l <= m) maxi = max(maxi, solve(l, r, s, m, 2*p));
if(r > m) maxi = max(maxi, solve(l, r, m+1, t, 2*p+1));
return maxi;
}
int main(){
cin>>N>>M;
for(int i = 1; i <= N; i++){
cin>>a[i];
}
build(1, N, 1);
int op;
int x, y, k;
for(int i = 1; i <= M; i++){
cin>>op>>x>>y;
if(op == 1){
cin>>k;
update_rename(x, y, k, 1, N, 1);
}
else if(op == 2){
cin>>k;
update_add(x, y, k, 1, N, 1);
}
else if(op==3){
cout<<solve(x, y, 1, N, 1)<<endl;
}
}
return 0;
}