#include <bits/stdc++.h>
#define maxN 100005
using namespace std;
struct aint
{
int bst,left,right;
}arb[4*maxN];
int n,m,i,j,op,x,y;
void build(int nod,int st,int dr)
{
if(st==dr)
{
arb[nod].bst=arb[nod].left=arb[nod].right=1;
return;
}
int mij=st+(dr-st)/2;
build(2*nod,st,mij);
build(2*nod+1,mij+1,dr);
arb[nod].bst=arb[nod].left=arb[nod].right=arb[2*nod].bst+arb[2*nod+1].bst;
}
void update(int nod,int st,int dr)
{
if(x<=st && dr<=y){
if(op==1)
arb[nod].bst=arb[nod].left=arb[nod].right=0;
if(op==2) arb[nod].bst=arb[nod].left=arb[nod].right=dr-st+1;
return;
}
if(st==dr)
return;
int mij=st+(dr-st)/2;
if(arb[nod].bst==0)
arb[2*nod].bst=arb[2*nod].left=arb[2*nod].right=0,
arb[2*nod+1].bst=arb[2*nod+1].left=arb[2*nod+1].right=0;
if(arb[nod].bst==dr-st+1)
arb[2*nod].bst=arb[2*nod].left=arb[2*nod].right=mij-st+1,
arb[2*nod+1].bst=arb[2*nod+1].left=arb[2*nod+1].right=dr-mij;
if(x<=mij)
update(2*nod,st,mij);
if(mij<y)
update(2*nod+1,mij+1,dr);
arb[nod].bst=max(arb[2*nod].bst,max(arb[2*nod+1].bst,arb[2*nod].right+arb[2*nod+1].left));
if(arb[2*nod].left==mij-st+1)
arb[nod].left=arb[2*nod].left+arb[2*nod+1].left;
else arb[nod].left=arb[2*nod].left;
if(arb[2*nod+1].right==dr-mij)
arb[nod].right=arb[2*nod].right+arb[2*nod+1].right;
else arb[nod].right=arb[2*nod+1].right;
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d %d",&n,&m);
build(1,1,n);
while(m--)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d %d",&x,&y);
y=x+y-1;
update(1,1,n);
continue;
}
if(op==2)
{
scanf("%d %d",&x,&y);
y=x+y-1;
update(1,1,n);
continue;
}
printf("%d\n",arb[1].bst);
}
return 0;
}