#include <cstdio>
#include <algorithm>
#define Nmax 100005
using namespace std;
int s[4*Nmax],st[4*Nmax],dr[4*Nmax],x,y,N;
inline void Initial(int nod, int l, int r)
{
int mij;
s[nod]=st[nod]=dr[nod]=r-l+1;
mij=(l+r)/2;
if(l<r)
{
Initial(nod*2,l,mij);
Initial(nod*2,mij+1,r);
}
}
inline void Update(int nod, int l, int r, int val)
{
int mij;
if(x<=l && r<=y)
{
s[nod]=st[nod]=dr[nod]=(r-l+1)*(1-val);
return ;
}
mij=(l+r)/2;
if(s[nod]==r-l+1)
{
s[nod*2]=st[nod*2]=dr[nod*2]=mij-l+1;
s[nod*2+1]=st[nod*2+1]=dr[nod*2+1]=r-mij;
}
if(s[nod]==0)
{
s[nod*2]=st[nod*2]=dr[nod*2]=0;
s[nod*2+1]=st[nod*2+1]=dr[nod*2+1]=0;
}
if(x<=mij)
Update(nod*2,l,mij,val);
if(y>mij)
Update(nod*2+1,mij+1,r,val);
val=st[2*nod];
if(val==mij-l+1)
val+=st[nod*2+1];
st[nod]=val;
val=dr[nod*2+1];
if(val==r-mij)
val+=dr[2*nod];
dr[nod]=val;
val=dr[nod*2]+st[2*nod+1];
val=max(val, s[nod*2]);
val=max(val, s[nod*2+1]);
s[nod]=val;
s[nod]=max(s[nod], st[nod]);
s[nod]=max(s[nod], dr[nod]);
}
int main()
{
int P,tip;
freopen ("hotel.in","r",stdin);
freopen ("hotel.out","w",stdout);
scanf("%d%d", &N,&P);
Initial(1,1,N);
while(P--)
{
scanf("%d", &tip);
if(tip==3)
printf("%d\n", s[1]);
else
{
scanf("%d%d", &x,&y);
y=x+y-1;
Update(1,1,N,2-tip);
}
}
return 0;
}