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