#include <bits/stdc++.h>
using namespace std;
ifstream f ("hotel.in");
ofstream g ("hotel.out");
const int nmax=1e5+3;
int n,q,tip,l,r;
struct
{
int st,dr,sol,lazy;
}arb[4*nmax];
void lenes(int nod,int a,int b)
{
arb[nod].st=arb[nod].dr=arb[nod].sol=b-a+1;
if(a==b)return;
int mij=(a+b)/2;
lenes(nod*2,a,mij);
lenes(nod*2+1,mij+1,b);
}
void propag(int nod,int a,int b)
{
if(arb[nod].lazy==0) return;
if(arb[nod].lazy==1) arb[nod].st=arb[nod].dr=arb[nod].sol=0;
else arb[nod].st=arb[nod].dr=arb[nod].sol=b-a+1;
if(a<b) arb[2*nod].lazy=arb[2*nod+1].lazy=arb[nod].lazy;
arb[nod].lazy=0;
}
void update(int nod,int a,int b,int st,int dr,int val)
{
int mij=(a+b)/2;
if(st<=a&&b<=dr)
{
arb[nod].lazy=val;
propag(nod,a,b);
return;
}
propag(nod,a,b);
if(st<=mij) update(nod*2,a,mij,st,dr,val);
//else propag(nod*2,a,mij);
if(dr>mij)update(nod*2+1,mij+1,b,st,dr,val);
//else propag(nod*2+1,mij+1,b);
arb[nod].sol=max(arb[2*nod].dr+arb[2*nod+1].st,max(arb[2*nod].sol,arb[2*nod+1].sol));
arb[nod].st=arb[2*nod].st;
if(arb[nod].st==mij-a+1) arb[nod].st+=arb[2*nod+1].st;
arb[nod].dr=arb[2*nod+1].dr;
if(arb[nod].dr==b-mij) arb[nod].dr+=arb[2*nod].dr;
}
int main()
{
f>>n>>q;
lenes(1,1,n);
while(q--)
{
f>>tip;
if(tip==3)
{
propag(1,1,n);
g<<arb[1].sol<<'\n';
}
else
{
f>>l>>r;
r+=l-1;
update(1,1,n,l,r,tip);
}
}
return 0;
}