#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll M = 1e6 + 5, X = 5e9;
ll n, m, s[M], d, x, y, c;
struct Node{
ll h, sum, qfg, mx = -M;
}t[4 * M];
void Build(ll a, ll b, ll num){
t[num].qfg = -X;
if(a == b){
t[num].h = s[a];
return;
}ll m = (a + b) / 2;
Build(a, m, num * 2);
Build(m + 1, b, num * 2 + 1);
}
void Sum(ll a, ll b, ll c, ll l, ll r, ll num){
if(a <= l && r <= b) {
t[num].sum += c;
t[num].h += (r - l + 1) * c;
return;
}ll mid = (l + r) / 2;
if(t[num].qfg != -X){
t[num].sum = 0;
t[num * 2].h = t[num].qfg * (mid - l + 1);
t[num * 2 + 1].h = t[num].qfg * (r - mid);
t[num * 2].qfg = t[num].qfg;
t[num * 2 + 1].qfg = t[num].qfg;
t[num].qfg = 0;
}
if(t[num].sum){
t[num * 2].h += t[num].sum * (mid - l + 1);
t[num * 2 + 1].h += t[num].sum * (r - mid);
t[num * 2].sum += t[num].sum;
t[num * 2 + 1].sum += t[num].sum;
t[num].sum = 0;
}
if(a <= mid) Sum(a, b, c, l, mid, num * 2);
if(b > mid) Sum(a, b, c, mid + 1, r, num * 2 + 1);
t[num].h = t[num * 2].h + t[num * 2 + 1].h;
}void Add(ll a, ll b, ll c, ll l, ll r, ll num){
if(a <= l && r <= b) {
t[num].qfg = c;
t[num].h = (r - l + 1) * c;
return;
}ll mid = (l + r) / 2;
if(t[num].qfg != -X){
t[num].sum = 0;
t[num * 2].h = t[num].qfg * (mid - l + 1);
t[num * 2 + 1].h = t[num].qfg * (r - mid);
t[num * 2].qfg = t[num].qfg;
t[num * 2 + 1].qfg = t[num].qfg;
t[num].qfg = 0;
}
if(a <= mid) Add(a, b, c, l, mid, num * 2);
if(b > mid) Add(a, b, c, mid + 1, r, num * 2 + 1);
t[num].h = t[num * 2].h + t[num * 2 + 1].h;
}
ll FindMax(ll a, ll b, ll l, ll r, ll num){
if(a <= l && r <= b && l == r) return t[num].h;
ll mid = (l + r) / 2, ans = -M;
if(t[num].qfg != -X){
t[num].sum = 0;
t[num * 2].h = t[num].qfg * (mid - l + 1);
t[num * 2 + 1].h = t[num].qfg * (r - mid);
t[num * 2].qfg = t[num].qfg;
t[num * 2 + 1].qfg = t[num].qfg;
t[num].qfg = 0;
}
if(t[num].sum){
t[num * 2].h += t[num].sum * (mid - l + 1);
t[num * 2 + 1].h += t[num].sum * (r - mid);
t[num * 2].sum += t[num].sum;
t[num * 2 + 1].sum += t[num].sum;
t[num].sum = 0;
}
if(a <= mid) ans = max(ans, FindMax(a, b, l, mid, num * 2));
if(b > mid) ans = max(ans, FindMax(a, b, mid + 1, r, num * 2 + 1));
return ans;
}
int main(){
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m;
for(ll i = 1; i <= n; i++){
cin >> s[i];
}Build(1, n, 1);
while(m--){
cin >> d;
if(d == 1){
cin >> x >> y >> c;
Add(x, y, c, 1, n, 1);
}if(d == 2){
cin >> x >> y >> c;
Sum(x, y, c, 1, n, 1);
}if(d == 3){
cin >> x >> y;
cout << FindMax(x, y, 1, n, 1) << '\n';
}
}
return 0;
}