#include <iostream>
#define NMAX 100000
#define MMAX 200000
using namespace std;
struct elem {
int ssm ;
int prefix ;
int sufix ;
int lazy ;
};
elem aint [ 4 * NMAX + 1 ] ;
void push_lazy (int nod, int st, int dr ) {
if (aint[nod].lazy != 0 ) {
int mid = (st + dr ) / 2 ;
if (aint[nod].lazy == 1 ) {
aint[2*nod].ssm = aint[2*nod].prefix = aint[2*nod].sufix = mid - st + 1 ;
aint[2*nod+1].ssm = aint[2*nod+1].prefix = aint[2*nod+1].sufix = dr - mid ;
}
else if (aint[nod].lazy == -1 ){
aint[2*nod].ssm = aint[2*nod].prefix = aint[2*nod].sufix = -1 ;
aint[2*nod+1].ssm = aint[2*nod+1].prefix = aint[2*nod+1].sufix = -1 ;
}
aint[2*nod].lazy = aint[2*nod+1].lazy = aint[nod].lazy ;
aint[nod].lazy = 0 ;
}
}
elem join (elem nod1, elem nod2, int st, int dr ) {
elem nod ;
nod.prefix = nod1.prefix ;
nod.sufix = nod2.sufix ;
int mid = ( st + dr ) / 2 ;
if (nod1.prefix == mid - st + 1 )
nod.prefix += nod2.prefix ;
if (nod2.sufix == dr - mid )
nod.sufix += nod1.sufix ;
nod.ssm = max ( max ( max (nod1.ssm, nod2.ssm), max (nod.prefix, nod.sufix) ), nod1.sufix+nod2.prefix ) ;
nod.lazy = 0 ;
return nod ;
}
void update (int nod, int st, int dr, int left, int right, int val ) {
push_lazy(nod, st, dr ) ;
if (st > left || dr < right )
return ;
else {
if (left <= st && dr <= right ) {
if (val == 1)
aint[nod].ssm = aint[nod].prefix = aint[nod].sufix = dr - st + 1 ;
else
aint[nod].ssm = aint[nod].prefix = aint[nod].sufix = -1 ;
aint[nod].lazy = val ;
}
else {
int mid = (st + dr ) / 2 ;
update (2 * nod, st, mid, left, right, val ) ;
update (2 * nod + 1, mid+1, dr, left, right, val ) ;
aint[nod] = join (aint[2*nod], aint[2*nod+1], st, dr ) ;
}
}
push_lazy(nod, st, dr ) ;
}
int main() {
FILE *fin, *fout ;
fin = fopen ("hotel.in", "r" ) ;
fout = fopen ("hotel.out", "w" ) ;
int n, i, m, tip, a, b ;
fscanf (fin, "%d%d", &n, &m ) ;
update (1, 1, n, 1, n, 1 ) ;
for (i = 0 ; i < m ; i++ ) {
fscanf (fin, "%d", &tip ) ;
switch (tip) {
case 1 : {
fscanf (fin, "%d%d", &a, &b ) ;
update (1, 1, n, a, a+b-1, -1 ) ;
break ;
}
case 2 : {
fscanf (fin, "%d%d", &a, &b ) ;
update (1, 1, n, a, a+b-1, 1 ) ;
break ;
}
case 3 : {
fprintf (fout, "%d\n", aint[1].ssm ) ;
break ;
}
}
}
return 0 ;
}