#include <cstdio>
#include <algorithm>
#define NMax 400000
using namespace std;
int Q[NMax+1];
int M[NMax+1];
int L[NMax+1];
int R[NMax+1];
int N,n;
inline void In(int p)
{
L[2*p] = R[2*p] = M[2*p] = 0;
L[2*p+1] = R[2*p+1] = M[2*p+1] = 0;
}
inline void Out(int p)
{
L[2*p] = R[2*p] = M[2*p] = Q[2*p];
L[2*p+1] = R[2*p+1] = M[2*p+1] = Q[2*p+1];
}
void Modify(int p)
{
R[p] = R[2*p+1];
if(Q[2*p+1] == R[2*p+1]) R[p] = R[p] + R[2*p];
L[p] = L[2*p];
if(Q[2*p] == L[2*p]) L[p] = L[p] + L[2*p+1];
M[p] = max(M[2*p], max(M[2*p+1], L[2*p+1] + R[2*p]));
}
void Update_in(int p, int x, int y, int st, int dr)
{
if(x==st && y==dr)
{
L[p] = R[p] = M[p] = 0;
return;
}
if(!M[p]) In(p);
if(M[p]==Q[p]) Out(p);
int m = (st+dr)/2;
if(y <= m) Update_in(2*p,x,y,st,m);
else if(m < x) Update_in(2*p+1,x,y,m+1,dr);
else { Update_in(2*p,x,m,st,m); Update_in(2*p+1,m+1,y,m+1,dr); }
Modify(p);
}
void Update_out(int p, int x, int y, int st, int dr)
{
if(x==st && y==dr)
{
L[p] = R[p] = M[p] = Q[p];
return;
}
if(!M[p]) In(p);
if(M[p]==Q[p]) Out(p);
int m = (st+dr)/2;
if(y <= m) Update_out(2*p,x,y,st,m);
else if(m < x) Update_out(2*p+1,x,y,m+1,dr);
else { Update_out(2*p,x,m,st,m); Update_out(2*p+1,m+1,y,m+1,dr); }
Modify(p);
}
void Build()
{
int i;
for(i = N; i < N+n; ++i) Q[i] = M[i] = R[i] = L[i] = 1;
for(i = N-1; i >= 1; --i) M[i] = Q[i] = R[i] = L[i] = M[2*i] + M[2*i+1];
}
int main(){
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
int P,x,y,c;
scanf("%d %d",&n,&P);
for(N=1; N < n; N*=2);
Build();
while(P--)
{
scanf("%d",&c);
if(c==1){
scanf("%d %d",&x,&y);
Update_in(1,x,x+y-1,1,N);
}
else if(c==2){
scanf("%d %d",&x,&y);
Update_out(1,x,x+y-1,1,N);
}
else printf("%d\n",M[1]);
}
return 0;
}