using namespace std;
#include <cstdio>
#include <algorithm>
#define Nmax 100010
int n1, n2, x, y, n, m, i, tip, q, a[3][4 * Nmax];
void update(int nod, int st, int dr, int p, int u, int val){
int mij = (st + dr) >> 1;
if( p <= st && dr <= u ){
if( val == 1 )
a[0][nod] = a[1][nod] = a[2][nod] = dr - st + 1;
else
a[0][nod] = a[1][nod] = a[2][nod] = 0;
return ;
}
if( a[1][nod] == 0 ){
n1 = nod << 1;
a[0][n1] = a[1][n1] = a[2][n1] = 0;
n1 = (nod << 1) + 1;
a[0][n1] = a[1][n1] = a[2][n1] = 0;
}
if( a[1][nod] == dr - st + 1 ){
q = mij - st + 1;
n1 = nod << 1;
a[0][n1] = a[1][n1] = a[2][n1] = q;
q = dr - (mij + 1) + 1;
n1 = (nod << 1) + 1;
a[0][n1] = a[1][n1] = a[2][n1] = q;
}
if( p <= mij ) update( (nod<<1), st, mij, p, u, val);
if( u > mij ) update( (nod<<1) + 1, mij + 1, dr, p, u, val );
n1 = nod << 1; n2 = (nod << 1) + 1;
a[0][nod] = a[0][n1];
if( a[0][n1] == mij - st + 1 ) a[0][nod]+=a[0][n2];
a[2][nod] = a[2][n2];
if( a[2][n2] == dr - (mij+1) + 1 ) a[2][nod]+=a[2][n1];
a[1][nod] = max(a[0][nod], a[2][nod]);
a[1][nod] = max(a[1][nod], a[1][n1]);
a[1][nod] = max(a[1][nod], a[1][n2]);
a[1][nod] = max(a[1][nod], a[2][n1]+a[0][n2]);
}
void update2(int nod, int st, int dr){
int mij = (st + dr) >> 1;
if(st == dr){
a[0][nod] = a[1][nod] = a[2][nod] = 1;
return ;
}
a[0][nod] = dr - st + 1; a[1][nod] = dr - st + 1; a[2][nod] = dr - st + 1;
update2(nod<<1, st, mij);
update2((nod<<1)+1, mij+1, dr);
}
int main(){
FILE *f = fopen("hotel.in", "r");
FILE *g = fopen("hotel.out", "w");
fscanf(f,"%d %d",&n, &m);
update2(1, 1, n);
for(i = 1; i <= m; i++){
fscanf(f,"%d",&tip);
if( tip == 1 ){
fscanf(f,"%d %d",&x, &y);
update(1, 1, n, x, x + y - 1, 0);
}
if(tip == 2){
fscanf(f,"%d %d",&x, &y);
update(1, 1, n, x, y = x + y - 1, 1);
}
if(tip == 3)
fprintf(g,"%d\n",a[1][1]);
}
fclose(f);
fclose(g);
return 0;
}