#include <fstream>
using namespace std;
ifstream cin ("hotel.in");
ofstream cout ("hotel.out");
struct Nod {
int lungime_maxima , prefix , sufix , update;
} Arbore[400000];
void Build (int nod , int stanga , int dreapta)
{
if (stanga == dreapta) {
Arbore[nod].lungime_maxima = Arbore[nod].prefix = Arbore[nod].sufix = 1;
Arbore[nod].update = -1;
return;
}
int mijloc = (stanga + dreapta) >> 1;
Build((nod << 1) , stanga , mijloc);
Build((nod << 1) + 1 , mijloc + 1 , dreapta);
Arbore[nod].lungime_maxima = Arbore[nod].prefix = Arbore[nod].sufix = dreapta - stanga + 1;
Arbore[nod].update = -1;
}
void Lazy_Update (int nod , int stanga , int dreapta)
{
if (Arbore[nod].update == -1)
return;
Arbore[nod].lungime_maxima = Arbore[nod].prefix = Arbore[nod].sufix = (!Arbore[nod].update ? dreapta - stanga + 1 : 0);
if (stanga != dreapta) Arbore[nod << 1].update = Arbore[(nod << 1) + 1].update = Arbore[nod].update;
Arbore[nod].update = -1;
}
void Update (int nod , int stanga , int dreapta , int stanga_interval , int dreapta_interval , int valoare)
{
Lazy_Update(nod , stanga , dreapta);
if (stanga_interval <= stanga && dreapta <= dreapta_interval) {
Arbore[nod].update = valoare; Lazy_Update(nod , stanga , dreapta);
return;
}
int mijloc = (stanga + dreapta) >> 1;
if (stanga_interval <= mijloc) Update((nod << 1) , stanga , mijloc , stanga_interval , dreapta_interval , valoare);
else Lazy_Update(nod << 1 , stanga , mijloc);
if (dreapta_interval > mijloc) Update((nod << 1) + 1 , mijloc + 1 , dreapta , stanga_interval , dreapta_interval , valoare);
else Lazy_Update((nod << 1) + 1 , mijloc + 1 , dreapta);
Arbore[nod].prefix = (Arbore[nod << 1].prefix == mijloc - stanga + 1 ? Arbore[nod << 1].prefix + Arbore[(nod << 1) + 1].prefix : Arbore[nod << 1].prefix);
Arbore[nod].sufix = (Arbore[(nod << 1) + 1].sufix == dreapta - mijloc ? Arbore[nod << 1].sufix + Arbore[(nod << 1) + 1].sufix : Arbore[(nod << 1) + 1].sufix);
Arbore[nod].lungime_maxima = max(Arbore[nod << 1].sufix + Arbore[(nod << 1) + 1].prefix , max(Arbore[nod << 1].lungime_maxima , Arbore[(nod << 1) + 1].lungime_maxima));
}
int main ()
{
int lungime , operatii;
cin >> lungime >> operatii;
Build(1 , 1 , lungime);
for (int indice = 1 , tip , inceput , lungime_secventa ; indice <= operatii ; indice++)
{
cin >> tip;
if (tip != 3) cin >> inceput >> lungime_secventa , Update(1 , 1 , lungime , inceput , inceput + lungime_secventa - 1 , (tip == 1 ? 1 : 0));
else cout << Arbore[1].lungime_maxima << '\n';
}
cout.close(); cin.close();
return 0;
}