#include<bits/stdc++.h>
using namespace std;
const int M = 5e4+10;
const int inf = 0x3f3f3f;
int n,m,sz,rt;
int c[M][2],fa[M],id[M],tag[M],v[M],mx[M],siz[M];
bool rev[M];
inline void pushup(int k){
int l = c[k][0],r = c[k][1];
mx[k] = max(max(mx[l],mx[r]),v[k]);
siz[k] = siz[l] + siz[r] + 1;
}
void pushdown(int k){
int l = c[k][0],r = c[k][1],t = tag[k];
if(t){
tag[k] = 0;
if(l) tag[l]+=t,mx[l]+=t,v[l]+=t;
if(r) tag[r]+=t,mx[r]+=t,v[r]+=t;
}
if(rev[k]){
rev[k] = 0; rev[l]^=1; rev[r]^=1;
swap(c[k][0],c[k][1]);
}
}
void rotate(int x,int &k){
int y = fa[x],z = fa[y],l,r;
if(c[y][0] == x) l = 0;
else l = 1;
r = l^1;
if(y == k) k = x;
else {
if(c[z][0]==y) c[z][0]=x;
else c[z][1] = x;
}
fa[x] = z;fa[y] = x;fa[c[x][r]]=y;
c[y][l]=c[x][r]; c[x][r]=y;
pushup(y); pushup(x);
}
void splay(int x,int &k){
while(x != k){
int y = fa[x],z = fa[y];
if(y != k){
if(c[y][0]==x^c[z][0]==y)rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
int Find(int k,int rk){
if(tag[k]||rev[k]) pushdown(k);
int l = c[k][0],r = c[k][1];
if(siz[l]+1==rk) return k;
else if(siz[l]>=rk) return Find(l,rk);
else return Find(r,rk-siz[l]-1);
}
inline void update(int l,int r,int val){
int x = Find(rt,l),y = Find(rt,r+2);
splay(x,rt); splay(y,c[x][1]);
int z = c[y][0];
tag[z] += val;v[z] += val; mx[z] += val;
}
inline void rever(int l,int r){
int x = Find(rt,l),y = Find(rt,r+2);
splay(x,rt); splay(y,c[x][1]);
int z = c[y][0];
rev[z] ^= 1;
}
inline void query(int l,int r){
int x = Find(rt,l),y = Find(rt,r+2);
splay(x,rt); splay(y,c[x][1]);
int z = c[y][0];
printf("%d\n",mx[z]);
}
inline void build(int l,int r,int f){
if(l > r) return ;
int now = id[l],last = id[f];
if(l == r){
fa[now] = last;siz[now]=1;
if(l < f) c[last][0] = now;
else c[last][1] = now;
return ;
}
int mid = (l + r) >> 1; now = id[mid];
build(l,mid-1,mid); build(mid+1,r,mid);
fa[now] = last; pushup(now);
if(mid < f) c[last][0] = now;
else c[last][1] = now;
}
int main()
{
mx[0] = -inf;
scanf("%d%d",&n,&m);
for(int i = 1;i <= n+2;i ++)
id[i] = ++sz;
build(1,n+2,0); rt = (n + 3) >> 1;
for(int i = 1;i <= m;i ++){
int f,l,r,val;
scanf("%d",&f);
scanf("%d%d",&l,&r);
if(f == 1) scanf("%d",&val),update(l,r,val);
if(f == 2) rever(l,r);
if(f == 3) query(l,r);
}
return 0;
}