#include<cstdio>
#include<algorithm>
using namespace std;
struct SegmentTree {int Left,Right,Best;};
SegmentTree A[(1<<18)+1];
int N,M,O,X,Y;
void Init(int Node,int Val)
{
A[Node].Left=A[Node].Right=A[Node].Best=Val;
}
void Update(int Node,int L,int R,int Val)
{
if(L>=X && R<=Y)
{
if(Val) Init(Node,0);
else Init(Node,R-L+1);
return;
}
int M=(L+R)/2;
int LS=2*Node;
int RS=2*Node+1;
if(A[Node].Best==R-L+1)
{
Init(LS,M-L+1);
Init(RS,R-M);
}
else if(A[Node].Best==0)
{
Init(LS,0);
Init(RS,0);
}
if(X<=M) Update(LS,L,M,Val);
if(Y>M) Update(RS,M+1,R,Val);
A[Node].Left=A[LS].Left;
if(A[LS].Left==M-L+1) A[Node].Left+=A[RS].Left;
A[Node].Right=A[RS].Right;
if(A[RS].Right==R-M) A[Node].Right+=A[LS].Right;
A[Node].Best=max(A[LS].Right+A[RS].Left,max(A[LS].Best,A[RS].Best));
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&N,&M);
A[1].Left=A[1].Right=A[1].Best=N;
for(;M;M--)
{
scanf("%d",&O);
if(O==1)
{
scanf("%d%d",&X,&Y);
Y=X+Y-1; Update(1,1,N,1);
}
else if(O==2)
{
scanf("%d%d",&X,&Y);
Y=X+Y-1; Update(1,1,N,0);
}
else printf("%d\n",A[1].Best);
}
return 0;
}