#include <stdio.h>
#include <algorithm>
#define NMax 100010
using namespace std;
const char IN[]="hotel.in",OUT[]="hotel.out";
struct nod{
int val,left,right;
} arb[5*NMax];
int N,P;
int C[5*NMax];
inline void expand(int poz,int st,int dr)
{
if (C[poz])
{
if (C[poz]==1)
arb[poz].val=arb[poz].left=arb[poz].right=0;
else if (C[poz]==-1)
arb[poz].val=arb[poz].left=arb[poz].right=dr-st+1;
if (st!=dr) C[2*poz]=C[2*poz+1]=C[poz];
C[poz]=0;
}
}
void Update(int poz,int st,int dr,int x,int y,int v)
{
if (x<=st && dr<=y)
{
C[poz]=v;
return;
}
expand(poz,st,dr);
int m=(st+dr)>>1;
if ( x<=m ) Update(2*poz,st,m,x,y,v);
if ( y>m ) Update(2*poz+1,m+1,dr,x,y,v);
expand(2*poz,st,m);expand(2*poz+1,m+1,dr);
arb[poz].val= max(max(arb[2*poz].val,arb[2*poz+1].val),arb[2*poz].right+arb[2*poz+1].left);
arb[poz].left= arb[2*poz].val==m-st+1 ? m-st+1+arb[2*poz+1].left : arb[2*poz].left;
arb[poz].right= arb[2*poz+1].val==dr-m ? dr-m+arb[2*poz].right : arb[2*poz+1].right;
}
int main()
{
int c,i,M;
freopen(IN,"r",stdin);
scanf("%d%d",&N,&P);
C[1]=-1;
expand(1,1,N);
freopen(OUT,"w",stdout);
while (P--)
{
scanf("%d",&c);
if (c==1)
{
scanf("%d%d",&i,&M);
Update(1,1,N,i,i+M-1,1);
}
else if (c==2)
{
scanf("%d%d",&i,&M);
Update(1,1,N,i,i+M-1,-1);
}
else
printf("%d\n",arb[1].val);
}
fclose(stdout);
fclose(stdin);
return 0;
}