#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int mmm=-1;
int a[1000010];
struct node{
int l,r;
int s,lan,cg;
}tr[3000010];
void qili(int k){
if(tr[k].cg!=INT_MAX){
tr[k*2].s=tr[k].cg;
tr[k*2+1].s=tr[k].cg;
tr[k*2].cg=tr[k].cg;
tr[k*2+1].cg=tr[k].cg;
tr[k*2].lan=0;
tr[k*2+1].lan=0;
}
else if(tr[k].lan){
tr[k*2].s+=tr[k].lan;
tr[k*2+1].s+=tr[k].lan;
tr[k*2+1].lan+=tr[k].lan;
tr[k*2].lan+=tr[k].lan;
}
tr[k].cg=INT_MAX;
tr[k].lan=0;
}
int cx(int k,int ll,int rr){
if(ll<=tr[k].l&&tr[k].r<=rr){
return tr[k].s;
}
qili(k);
int mid=(tr[k].l+tr[k].r)/2;
int maxn=INT_MIN;
if(ll<=mid){
maxn=max(cx(k*2,ll,mid),maxn);
}
if(mid<rr){
maxn=max(cx(k*2+1,mid+1,rr),maxn);
}
return maxn;
}
void xg(int k,int ll,int rr,int sum,int f){
if(ll<=tr[k].l&&tr[k].r<=rr){
if(f){
tr[k].s=sum;
tr[k].cg=sum;
tr[k].lan=0;
cout<<k<<endl;
}
else{
tr[k].s+=sum;
tr[k].lan+=sum;
}
return;
}
int mid=(tr[k].l+tr[k].r)/2;
if(ll<=mid){
xg(k*2,ll,rr,sum,f);
}
if(rr>mid){
xg(k*2+1,ll,rr,sum,f);
}
tr[k].s=max(tr[k*2].s,tr[k*2+1].s);
}
void build(int k,int ll,int rr){
mmm=max(mmm,k);
tr[k].l=ll;
tr[k].r=rr;
tr[k].lan=0;
tr[k].cg=INT_MAX;
if(ll==rr){
tr[k].s=a[ll];
return;
}
build(k*2,ll,(ll+rr)/2);
build(k*2+1,(ll+rr)/2+1,rr);
tr[k].s=max(tr[k*2].s,tr[k*2+1].s);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=mmm;i++){
cout<<i<<" "<<tr[i].l<<" "<<tr[i].r<<" "<<tr[i].s<<endl;
}
for(int i=1;i<=m;i++){
int flag;
cin>>flag;
if(flag==1){
int x,y,ans;
cin>>x>>y>>ans;
xg(1,x,y,ans,1);
}
else if(flag==2){
int x,y,ans;
cin>>x>>y>>ans;
xg(1,x,y,ans,0);
}
else {
int x,y;
cin>>x>>y;
cout<<cx(1,x,y)<<endl;
}
}
for(int i=1;i<=mmm;i++){
cout<<i<<" "<<tr[i].l<<" "<<tr[i].r<<" "<<tr[i].s<<endl;
}
return 0;
}