#include <iostream>
#include <fstream>
#define MAX 1e16
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
struct arb{
int st, dr, sol, lazy;
};
arb v[400055];
int n, s, d, x, i, p, l, r;
void initial(int a, int b, int nod)
{
v[nod].dr = v[nod].st = v[nod].sol = b - a + 1;
if (a == b) return;
int mij = (a + b) / 2;
initial(a, mij, nod*2);
initial(mij + 1, b, nod*2 + 1);
}
void propag(int a, int b, int nod)
{
if (v[nod].lazy == 0) return;
if (v[nod].lazy == 2)
{
v[nod].dr = v[nod].st = v[nod].sol = b - a + 1;
}
else if (v[nod].lazy == 1)
{
v[nod].dr = v[nod].st = v[nod].sol = 0;
}
if (a<b)
v[2*nod].lazy = v[2*nod + 1].lazy = v[nod].lazy;
v[nod].lazy = 0;
}
void act(int a, int b, int ua, int ub, int nod, int val)
{
if (ua <= a && ub >= b)
{
v[nod].lazy = val;
propag(a, b, nod);
return;
}
int mij = (a + b) / 2;
propag(a, b, nod);
if (ua <= mij) act(a, mij, ua, ub, 2*nod, val);
else propag(a, mij, 2*nod);
if (ub > mij) act (mij + 1, b, ua, ub, 2*nod + 1, val);
else propag(mij + 1, b, 2*nod + 1);
v[nod].sol = max (v[2*nod].dr + v[2*nod + 1].st, max(v[2*nod].sol, v[2*nod + 1].sol));
v[nod].st = v[2*nod].st;
if (v[nod].st == mij - a + 1)
v[nod].st += v[2 * nod + 1].st;
v[nod].dr = v[2 * nod + 1].dr;
if (v[nod].dr == b - mij) v[nod].dr += v[2 * nod].dr;
}
int main()
{
f>>n>>p;
initial(1, n, 1);
for (i=1; i<=p; i++)
{
f>>s;
if (s == 3)
{
propag(1, n, 1);
g<<v[1].sol<<endl;
continue;
}
f>>l>>r;
r += l - 1;
act(1, n, l, r, 1, s);
}
return 0;
}