#include<fstream>
#include<algorithm>
using namespace std;
const int N = 100003;
struct data{ int pre,suf,sum;} tree[N];
int n,m,i,op,x,y;
void build(int k,int l, int r)
{
if (l==r) tree[k].sum=tree[k].suf=tree[k].pre=1;
else{
int mij=(l+r)/2;
build(2*k,l,mij);
build(2*k+1,mij+1,r);
tree[k].sum=tree[k].suf=tree[k].pre=tree[2*k].sum+tree[2*k+1].sum;
}
}
void push(int k,int L, int R)
{ int m=(L+R)/2;
if (tree[k].sum==R-L+1){
tree[2*k].sum=tree[2*k].pre=tree[2*k].suf=m-L+1;
tree[2*k+1].sum=tree[2*k+1].pre=tree[2*k+1].suf=R-m;
} else
if (tree[k].sum==0)
tree[2*k].sum=tree[2*k].pre=tree[2*k].suf =
tree[2*k+1].sum=tree[2*k+1].pre=tree[2*k+1].suf = 0;
}
void update(int k, int L, int R, int l, int r, int val)
{
if (l==L && r==R){
tree[k].sum=tree[k].pre=tree[k].suf=(r-l+1)*val;
return ;
}
int mij=(L+R)/2;
push(k,L,R);
if (r<=mij) update(2*k,L,mij,l,r,val); else
if (l>mij) update(2*k+1,mij+1,R,l,r,val);
else{
update(2*k,L,mij,l,mij,val);
update(2*k+1,mij+1,R,mij+1,r,val);
}
tree[k].sum=max(max(tree[2*k].sum,tree[2*k+1].sum),tree[2*k].suf+tree[2*k+1].pre);
tree[k].pre=tree[2*k].pre;
if (tree[2*k].sum==mij-L+1)tree[k].pre+=tree[2*k+1].pre;
tree[k].suf=tree[2*k+1].suf;
if (tree[2*k+1].sum==R-mij)tree[k].suf+=tree[2*k].suf;
}
int main()
{
ifstream cin("hotel.in");
ofstream cout("hotel.out");
cin>>n>>m;
build(1,1,n);
while (m--)
{
cin>>op;
if (op==3)
cout<<tree[1].sum<<"\n";
else{
cin>>x>>y;
update(1,1,n,x,x+y-1,!(op%2));
}
}
return 0;
}