#include <cstdio>
#include <iostream>
#define DIMN 100001
using namespace std;
struct arbore {
int sol,down,lc,rc;
};
arbore aint [4*DIMN];
void update (int nod,int st,int dr,int l,int r,int val){
int mid;
if (l<=st && dr<=r){
if (val==1){ // se ocupa
aint[nod].lc=aint[nod].rc=aint[nod].sol=0;
aint[nod].down=1;
}
else { // se elibereaza
aint[nod].lc=aint[nod].rc=aint[nod].sol=dr-st+1;
aint[nod].down=1;
}
return;
}
mid=(st+dr)/2;
if (aint[nod].down==1){
if (aint[nod].sol==0){
aint[2*nod].lc=aint[2*nod].rc=aint[2*nod].sol=0;
aint[2*nod+1].lc=aint[2*nod+1].rc=aint[2*nod+1].sol=0;
}
else{
aint[2*nod].lc=aint[2*nod].rc=aint[2*nod].sol=mid-st+1;
aint[2*nod+1].lc=aint[2*nod+1].rc=aint[2*nod+1].sol=dr-(mid+1)+1;
}
aint[2*nod].down=aint[2*nod+1].down=1;
aint[nod].down=0;
}
if (l<=mid)
update (2*nod,st,mid,l,r,val);
if (mid+1<=r)
update (2*nod+1,mid+1,dr,l,r,val);
aint[nod].sol=max(max(aint[2*nod].sol,aint[2*nod+1].sol),aint[2*nod].rc+aint[2*nod+1].lc);
if (aint[2*nod].lc==mid-st+1)
aint[nod].lc=aint[2*nod].lc+aint[2*nod+1].lc;
else
aint[nod].lc=aint[2*nod].lc;
if (aint[2*nod+1].rc==dr-(mid+1)+1)
aint[nod].rc=aint[2*nod+1].rc+aint[2*nod].rc;
else
aint[nod].rc=aint[2*nod+1].rc;
}
int main()
{
FILE *fin=fopen ("hotel.in","r");
FILE *fout=fopen ("hotel.out","w");
int n,q,cer,p,m;
fscanf (fin,"%d%d",&n,&q);
update (1,1,n,1,n,0);
for (;q;q--){
fscanf (fin,"%d",&cer);
if (cer==1){
fscanf (fin,"%d%d",&p,&m);
update (1,1,n,p,p+m-1,1);
}
else if (cer==2){
fscanf (fin,"%d%d",&p,&m);
update (1,1,n,p,p+m-1,0);
}
else fprintf (fout,"%d\n",aint[1].sol);
}
return 0;
}