#include <fstream>
#include <stdint.h>
#define nmax 100001
#define pmax 200001
using namespace std;
fstream f1("hotel.in", ios::in);
fstream f2("hotel.out", ios::out);
int32_t n, p;
struct arb_int
{
int32_t l, r, total;
} arb[nmax*4];
///arb[poz].total= lungimea secv maxime libere din intervalul coresp lui poz
///arb[poz].l= lungime secv maxime libere care incepe din st din intervalul coresp lui poz
///arb[poz].r= lungime secv maxime libere care incepe din dr din intervalul coresp lui poz
///arb[poz].sum= suma el coresp intervalului lui poz
void citire()
{
f1>>n>>p;
}
int32_t maxim(int32_t a, int32_t b)
{
if(a>b) return a;
else return b;
}
void creare(int32_t poz, int32_t st, int32_t dr)
{
if(st<dr)
{
int32_t mijl=(st+dr)/2;
creare(2*poz, st, mijl);
creare(2*poz+1, mijl+1, dr);
arb[poz].total=dr-st+1;
arb[poz].l=dr-st+1;
arb[poz].r=dr-st+1;
}
else if(st==dr)
{
arb[poz].total=dr-st+1;
arb[poz].l=dr-st+1;
arb[poz].r=dr-st+1;
}
}
void functie(int32_t st, int32_t dr, int32_t mijl, int32_t poz)
{
arb[poz].total=maxim(arb[poz*2].total ,maxim(arb[poz*2+1].total, arb[poz*2].r+arb[poz*2+1].l));
if(arb[poz*2].total==(mijl-st+1)) arb[poz].l=maxim(arb[poz*2].l, arb[poz*2].total+arb[poz*2+1].l);
else arb[poz].l=arb[poz*2].l;
if(arb[poz*2+1].total==(dr-mijl)) arb[poz].r=maxim(arb[poz*2+1].r, arb[poz*2+1].total+arb[poz*2].r);
else arb[poz].r=arb[poz*2+1].r;
}
void init(int32_t poz, int32_t val)
{
arb[poz].total=val;
arb[poz].l=val;
arb[poz].r=val;
}
void aduna(int32_t poz, int32_t st, int32_t dr, int32_t x, int32_t y)
{
if(st<=dr)
{
if((x<=st)&&(dr<=y))
{
///modifici doar nodul curent
///umpli camera
init(poz, 0);
}
else
{
int32_t mijl=(st+dr)/2;
if(arb[poz].total==(dr-st+1))
{
init(poz*2, mijl-st+1);
init(poz*2+1, dr-mijl);
}
if(arb[poz].total==0)
{
init(poz*2, 0);
init(poz*2+1, 0);
}
if(x<=mijl) aduna(poz*2, st, mijl, x, y);
if(mijl<y) aduna(poz*2+1, mijl+1, dr, x, y);
///reactualizare
functie(st, dr, mijl, poz);
}
}
}
void scade(int32_t poz, int32_t st, int32_t dr, int32_t x, int32_t y)
{
if(st<=dr)
{
if((x<=st)&&(dr<=y))
{
///modifici doar nodul curent
///golesti camera
init(poz, dr-st+1);
}
else
{
int32_t mijl=(st+dr)/2;
if(arb[poz].total==(dr-st+1))
{
init(poz*2, mijl-st+1);
init(poz*2+1, dr-mijl);
}
if(arb[poz].total==0)
{
init(poz*2, 0);
init(poz*2+1, 0);
}
if(x<=mijl) scade(poz*2, st, mijl, x, y);
if(mijl<y) scade(poz*2+1, mijl+1, dr, x, y);
///reactualizare
functie(st, dr, mijl, poz);
}
}
}
void intrebare()
{
int32_t i, v, x, y;
for(i=1; i<=p; i++)
{
f1>>v;
if(v==1) {f1>>x>>y; aduna(1, 1, n, x, x+y-1);}///aduni o unitate la secv x y
if(v==2) {f1>>x>>y; scade(1, 1, n, x, x+y-1);}///scazi o unitate la secv x y
if(v==3) {f2<<arb[1].total<<"\n";}
}
}
int main()
{
citire();
creare(1, 1, n);
intrebare();
return 0;
}