#include<bits/stdc++.h>
#define MAXN 50005
using namespace std;
struct FHQTreap
{
int son[2],siz,val,key,add,rev,maxn;
}t[MAXN];
int n,m,siz,root;
void Update(int rt)
{
t[rt].siz=t[t[rt].son[0]].siz+t[t[rt].son[1]].siz+1;
t[rt].maxn=t[rt].val;
if(t[rt].son[0]) t[rt].maxn=max(t[rt].maxn,t[t[rt].son[0]].maxn);
if(t[rt].son[1]) t[rt].maxn=max(t[rt].maxn,t[t[rt].son[1]].maxn);
}
void PushDown(int rt)
{
if(t[rt].rev)
{
if(t[rt].son[0]) t[t[rt].son[0]].rev^=1;
if(t[rt].son[1]) t[t[rt].son[1]].rev^=1;
swap(t[rt].son[0],t[rt].son[1]);
t[rt].rev=0;
}
if(t[rt].add)
{
if(t[rt].son[0])
{
t[t[rt].son[0]].add+=t[rt].add;
t[t[rt].son[0]].val+=t[rt].add;
t[t[rt].son[0]].maxn+=t[rt].add;
}
if(t[rt].son[1])
{
t[t[rt].son[1]].add+=t[rt].add;
t[t[rt].son[1]].val+=t[rt].add;
t[t[rt].son[1]].maxn+=t[rt].add;
}
t[rt].add=0;
Update(rt);
}
}
int NewNode(int val)
{
t[siz].siz=1;
t[siz].val=val;
t[siz].key=rand();
t[siz].maxn=val;
return siz;
}
int Merge(int x,int y)
{
if(x) PushDown(x);
if(y) PushDown(y);
if(!x || !y) return x+y;
if(t[x].key<t[y].key)
{
t[x].son[1]=Merge(t[x].son[1],y);
Update(x);
return x;
}
else
{
t[y].son[0]=Merge(x,t[y].son[0]);
Update(y);
return y;
}
}
void Split(int rt,int pos,int &x,int &y)
{
if(!rt) x=y=0;
else
{
PushDown(rt);
if(t[t[rt].son[0]].siz>=pos)
{
y=rt;
Split(t[rt].son[0],pos,x,t[rt].son[0]);
}
else
{
x=rt;
Split(t[rt].son[1],pos-t[t[rt].son[0]].siz-1,t[rt].son[1],y);
}
Update(rt);
}
}
void Insert(int val)
{
int x,y;
Split(root,val,x,y);
root=Merge(Merge(x,NewNode(val)),y);
}
void Modify(int pos,int sum,int val)
{
int x,y,z;
Split(root,pos-1,x,y);
Split(y,sum,y,z);
t[y].val+=val;
t[y].maxn+=val;
t[y].add+=val;
root=Merge(Merge(x,y),z);
}
void Reverse(int pos,int sum)
{
int x,y,z;
Split(root,pos-1,x,y);
Split(y,sum,y,z);
t[y].rev^=1;
root=Merge(Merge(x,y),z);
}
void Query(int pos,int sum)
{
int x,y,z;
Split(root,pos-1,x,y);
Split(y,sum,y,z);
printf("%d\n",t[y].maxn);
root=Merge(Merge(x,y),z);
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i) Insert(0);
for(int i=1;i<=m;i++)
{
int opt,x,y,z;
scanf("%d %d %d",&opt,&x,&y);
if(opt1)
{
scanf("%d",&z);
Modify(x,y-x+1,z);
}
else if(opt2) Reverse(x,y-x+1);
else if(opt==3) Query(x,y-x+1);
}
return 0;
}