#include <bits/stdc++.h>
using namespace std;
const int N=1e4+5;
struct FHQ {
int si,pr,l,r;
int v,ad,re,mx;
}t[N];
int n,Q,pos,root;
#define lx(x) t[x].l
#define rx(x) t[x].r
inline void upd(int u) {
t[u].si=t[lx(u)].si+t[rx(u)].si+1;
t[u].mx=t[u].v;
if(lx(u))
t[u].mx=max(t[u].mx,t[lx(u)].mx);
if(rx(u))
t[u].mx=max(t[u].mx,t[rx(u)].mx);
}
inline void down(int u) {
if(t[u].re) {
if(lx(u)) t[lx(u)].re^=1;
if(rx(u)) t[rx(u)].re^=1;
lx(u)^=rx(u)^=lx(u)^=rx(u);
t[u].re=0;
}
if(t[u].ad) {
if(lx(u)) {
t[lx(u)].ad+=t[u].ad,
t[lx(u)].v+=t[u].ad,
t[lx(u)].mx+=t[u].ad;
}
if(rx(u)) {
t[rx(u)].ad+=t[u].ad;
t[rx(u)].v+=t[u].ad;
t[rx(u)].mx+=t[u].ad;
}
t[u].ad=0;
upd(u);
}
}
int merge(int u,int v) {
if(u==0||v==0) return u+v;
down(u),down(v);
if(t[u].pr<t[v].pr) {
rx(u)=merge(lx(u),v);
upd(u);
return u;
}
else {
lx(v)=merge(u,lx(v));
upd(v);
return v;
}
}
void split(int u,int key,int &L,int &R) {
if(u==0) {
L=R=0;
return;
}
down(u);
if(t[lx(u)].si>=key) {
R=u;
split(lx(u),key,L,lx(R));
}
else {
L=u;
split(rx(u),key-t[lx(u)].si-1,rx(L),R);
}
upd(u);
}
inline void ins(int val) {
t[++pos].pr=rand(),
t[pos].v=val,t[pos].mx=val,
t[pos].si=1;
root=merge(root,pos);
}
inline void add(int l,int r,int w) {
int a,b,c;
split(root,l-1,a,b);
split(b,r-l+1,b,c);
t[b].mx+=w,t[b].ad+=w,t[b].v+=w;
root=merge(merge(a,b),c);
}
inline void rev(int l,int r) {
int a,b,c;
split(root,l-1,a,b);
split(b,r-l+1,b,c);
t[b].re^=1;
root=merge(merge(a,b),c);
}
inline void maxx(int l,int r) {
int a,b,c;
split(root,l-1,a,b);
split(b,r-l+1,b,c);
cout<<t[b].mx<<'\n';
root=merge(merge(a,b),c);
}
signed main() {
cin>>n>>Q;
for(int i=1;i<=n;++i) ins(0);
while(Q--) {
int opt,l,r,w;
cin>>opt>>l>>r;
if(opt==1) {
cin>>w;
add(l,r,w);
} else if(opt==2) {
rev(l,r);
} else if(opt==3) {
maxx(l,r);
}
}
return 0;
}