#include <fstream>
using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");
const int NMAX = 100000;
struct NOD {
int mx, lf, rt;
};
NOD arb[4*NMAX+2];
int N, M;
/// Arbore
void Recalc( int nod, int L, int R ) {
int fS = 2*nod, fD = 2*nod+1;
arb[nod].lf = arb[fS].lf;
if( arb[fS].lf == L ) arb[nod].lf = L + arb[fD].lf;
arb[nod].rt = arb[fD].rt;
if( arb[fD].rt == R ) arb[nod].rt = R + arb[fS].rt;
arb[nod].mx = max( arb[fS].rt+arb[fD].lf , max(arb[fS].mx , arb[fD].mx) );
}
void Update_in( int nod, int st, int dr, int x, int y ) {
if( st == dr ) {
arb[nod].mx = arb[nod].lf = arb[nod].rt = 0;
return ;
}
if( x <= st && dr <= y ) {
arb[nod].mx = arb[nod].lf = arb[nod].rt = 0;
return ;
}
int mid = (st+dr) / 2, fS = 2*nod, fD = 2*nod+1;
if( x <= mid ) Update_in( fS, st, mid, x,y );
if( y > mid ) Update_in( fD, mid+1, dr, x,y );
Recalc( nod, mid-st+1, dr-mid );
}
void Update_out( int nod, int st, int dr, int x, int y ) {
if( st == dr ) {
arb[nod].mx = arb[nod].lf = arb[nod].rt = 1;
return ;
}
if( x <= st && dr <= y ) {
arb[nod].mx = arb[nod].lf = arb[nod].rt = dr - st + 1;
return ;
}
int mid = (st+dr) / 2, fS = 2*nod, fD = 2*nod+1;
if( x <= mid ) Update_out( fS, st, mid, x,y );
if( y > mid ) Update_out( fD, mid+1, dr, x,y );
Recalc( nod, mid-st+1, dr-mid );
}
/// Operatii
void Oper_1() {
int x,y,l;
in >> x >> l;
y = x + l - 1;
Update_in( 1, 1,N, x,y );
}
void Oper_2() {
int x,y,l;
in >> x >> l;
y = x + l - 1;
Update_out( 1, 1,N, x,y );
}
void Oper_3() {
out << arb[1].mx << '\n';
}
int main() {
in >> N >> M;
for( int i = 1; i <= N; ++i ) Update_out( 1, 1,N, i,i );
for( int i = 1; i <= M; ++i ) {
int OP;
in >> OP;
if( OP == 1 ) Oper_1();
if( OP == 2 ) Oper_2();
if( OP == 3 ) Oper_3();
}
return 0;
}