// #pragma GCC optimize(3,"Ofast","inline")
// #pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
#define all(v) v.begin(), v.end()
#define point(n) fixed << setprecision(n)
#define IOS \
ios::sync_with_stdio(false); \
cin.tie(0), cout.tie(0);
#define debug(a) cout << "=======" << a << "========" << endl;
#define endl '\n'
#define inf 0x3f3f3f3f
typedef long long ll;
typedef pair<ll, ll> PII;
typedef pair<ll, array<ll, 2>> PIA;
const int N = 1e6 + 10, mod = 1e9 + 7;
const double eps = 1e-8;
const ll INF = 0x3f3f3f3f3f3f3f3f;
int n, m, k;
int f[N];
struct node
{
int l,r;
ll sum,la=-INF,lb; /* data */
}tr[4*N];
void pushup(int u)
{
tr[u].sum=max(tr[u<<1].sum,tr[u<<1|1].sum);
}
void pushdown(int u)
{
if(tr[u].la!=-INF){
// cout<<tr[u].la<<' '<<u<<endl;
tr[u<<1].la=tr[u<<1|1].la=tr[u].la;
tr[u<<1].sum=tr[u].la;
tr[u<<1|1].sum=tr[u].la;
tr[u].la=-INF;
tr[u].lb=0;
// tr[u<<1].lb=0,tr[u<<1|1].lb=0;
}
if(tr[u].lb){
tr[u<<1|1].lb+=tr[u].lb;
tr[u<<1].lb+=tr[u].lb;
tr[u<<1].sum+=tr[u].lb;
tr[u<<1|1].sum+=tr[u].lb;
tr[u].lb=0;
}
}
void build(int u,int l,int r)
{
tr[u]={l,r};
if(l==r){
tr[u].sum=f[l];
return ;
}
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void modify1(int u,int l,int r,ll x)
{
if(tr[u].l>=l&&tr[u].r<=r){
tr[u].la=x;
tr[u].sum=x;
// pushdown(u);
return ;
}
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid)modify1(u<<1,l,r,x);
if(r>mid)modify1(u<<1|1,l,r,x);
pushup(u);
}
void modify2(int u,int l,int r,ll x)
{
if(tr[u].l>=l&&tr[u].r<=r){
//cout<<tr[u].sum<<' '<<x<<endl;
tr[u].lb+=x;
tr[u].sum+=x;
// cout<<tr[u].sum<<endl;
// pushdown(u);
return ;
}
int mid=tr[u].l+tr[u].r>>1;
pushdown(u);
if(l<=mid)modify2(u<<1,l,r,x);
if(r>mid)modify2(u<<1|1,l,r,x);
pushup(u);
}
ll query(int u,int l,int r)
{
if(tr[u].l>=l&&tr[u].r<=r){
return tr[u].sum;
}
int mid=tr[u].l+tr[u].r>>1;
pushdown(u);
ll ans=-1e18;
if(l<=mid)ans=max(ans,query(u<<1,l,r));
if(r>mid)ans=max(ans,query(u<<1|1,l,r));
return ans;
}
void solve()
{
cin >>n >> m;
for(int i=1;i<=n;i++)cin >> f[i];
build(1,1,n);
while(m--){
ll a,b,c,d;
cin >> a >> b >> c;
if(a==1){
cin >>d;
modify1(1,b,c,d);
}else if(a==2){
cin >>d;
modify2(1,b,c,d);
}else {
// cout<<query(1,c,c);
cout<<query(1,b,c)<<endl;
}
// cout<<query(1,1,n)<<endl;
}
}
int main()
{
IOS;
int _ = 1;
// cin >> _;
while (_--)
{
solve();
}
return 0;
}