#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100000;
struct hotel
{
int l , mij , r;
hotel(int x = 0)
{
l = mij = r = x;
}
};
hotel aint[4 * NMAX + 5];
int lazy[4 * NMAX + 5] , lg[4 * NMAX + 5];
int ql , qr , new_val;
void lazy_update(int nod , int st , int dr)
{
int med = (st + dr) / 2;
lazy[nod << 1] = lazy[nod];
aint[nod << 1] = hotel(lazy[nod] * (med - st + 1));
lazy[(nod << 1)|1] = lazy[nod];
aint[(nod << 1)|1] = hotel(lazy[nod] * (dr - med));
lazy[nod] = -1;
}
void update_nod(int nod)
{
int ls , rs;
ls = (nod << 1);
rs = ((nod << 1)|1);
if(aint[ls].l > 0)
{
aint[nod].l = aint[ls].l;
if(aint[ls].l == lg[ls] && aint[rs].l > 0)
aint[nod].l += aint[rs].l;
}
else
aint[nod].l = 0;
if(aint[rs].r > 0)
{
aint[nod].r = aint[rs].r;
if(aint[rs].r == lg[rs] && aint[ls].r > 0)
aint[nod].r += aint[ls].r;
}
else
aint[nod].r = 0;
int m1 = max(aint[ls].mij , aint[rs].mij);
int m2 = max(aint[ls].l , aint[rs].l);
int m3 = max(aint[ls].r , aint[rs].r);
int m4 = aint[ls].r + aint[rs].l;
int m5 , m6;
m5 = m6 = 0;
if(aint[ls].l == lg[ls])
m5 = lg[ls];
if(aint[rs].l == lg[rs])
m6 = lg[rs];
aint[nod].mij = max(m1 , max(m2 , max(m3 , max(m4 , max(m5 , max(m6 , m5 + m6))))));
}
void build(int st , int dr , int nod)
{
lazy[nod] = -1;
lg[nod] = dr - st + 1;
if(st == dr)
aint[nod] = hotel(1);
else
{
int med = (st + dr) / 2;
build(st , med , nod << 1);
build(med + 1 , dr , (nod << 1)|1);
update_nod(nod);
}
}
void update(int st , int dr , int nod)
{
if(lazy[nod] > -1 && st < dr)
lazy_update(nod , st , dr);
if(ql <= st && dr <= qr)
{
lazy[nod] = new_val;
aint[nod] = hotel(new_val * (dr - st + 1));
return;
}
if(st < dr)
{
int med = (st + dr) / 2;
if(ql <= med)
update(st , med , nod << 1);
if(qr > med)
update(med + 1 , dr , (nod << 1)|1);
update_nod(nod);
}
}
int query(int n)
{
if(lazy[1] > -1)
lazy_update(1 , 1 , n);
return max(aint[1].mij , max(aint[1].l , aint[1].r));
}
int main()
{
freopen("hotel.in" , "r" , stdin);
freopen("hotel.out" , "w" , stdout);
int n , p , c , x , y , i;
scanf("%d%d" , &n , &p);
build(1 , n , 1);
for(i = 1 ; i <= p ; i ++)
{
scanf("%d" , &c);
if(c <= 2)
{
scanf("%d%d" , &x , &y);
ql = x;
qr = x + y - 1;
if(c == 1)
new_val = 0;
else
new_val = 1;
update(1 , n , 1);
}
else
printf("%d\n" , query(n));
}
return 0;
}