#include <iostream>
#include <stdio.h>
using namespace std;
FILE *f=fopen("hotel.in","r");
FILE *g=fopen("hotel.out","w");
int v[300000],n,p,i,c,a,nr,maxim,k=0;
int mx(int a ,int b)
{
if(a>b)return a;else return b;
}
void update(int l,int r, int pi, int pf, int val ,int nod)
{
int m=(l+r)/2;
if(l==r) {v[nod]+=val;return;}
else
{
if(pi<=m) update(l,m,pi,pf,val,2*nod);
if(pf>=m) update(m+1,r,pi,pf,val,2*nod+1);
}
v[nod]=v[2*nod]+v[2*nod+1];
}
void query(int l, int r,int nod)
{
int m=(l+r)/2,s1,s2;
if (l==r)
{ if(v[nod]==0)k++;
if(v[nod]==1&&k>maxim){maxim=k;k=0;}
return;
}
query(l,m,2*nod);
query(m+1,r,2*nod+1);
}
int main()
{
fscanf(f,"%d%d",&n,&p);
//update(1,n,1,n,1,1);
for(i=1;i<=p;i++)
{
fscanf(f,"%d",&c);
switch(c)
{
case 1:
{
fscanf(f,"%d%d",&a,&nr);
update(1,n,a,nr+a-1,1,1);
break;
}
case 2:
{
fscanf(f,"%d%d",&a,&nr);
update(1,n,a,nr+a-1,-1,1);
break;
}
case 3:
{
maxim=0;
k=0;
query(1,n,1);
if(k>maxim)maxim=k;
fprintf(g,"%d\n",maxim);
break;
}
}
}
fclose(g);
return 0;
}