#include <cstdio>
#include <algorithm>
using namespace std;
struct arbint
{
int st,dr,sol,lazy;
}arb[400010];
void init(int nod,int st,int dr)
{
arb[nod].st=arb[nod].dr=arb[nod].sol=dr-st+1;
if(st==dr) return;
int mid=(st+dr)/2;
init(nod*2,st,mid);
init(nod*2+1,mid+1,dr);
}
void propag(int nod,int st,int dr)
{
if(arb[nod].lazy==0) return;
if(arb[nod].lazy==2) arb[nod].st=arb[nod].dr=arb[nod].sol=dr-st+1;
else if(arb[nod].lazy==1) arb[nod].st=arb[nod].dr=arb[nod].sol=0;
if(st<dr) arb[nod*2].lazy=arb[nod*2+1].lazy=arb[nod].lazy;
arb[nod].lazy=0;
}
void update(int nod,int st,int dr,int left,int right,int val)
{
if(left<=st && dr<=right)
{
arb[nod].lazy=val;
propag(nod,st,dr);
return;
}
propag(nod,st,dr);
int mid=(st+dr)/2;
if(left<=mid) update(nod*2,st,mid,left,right,val);
else propag(nod*2,st,mid);
if(mid<right) update(nod*2+1,mid+1,dr,left,right,val);
else propag(nod*2+1,mid+1,dr);
arb[nod].sol=max(arb[nod*2].dr+arb[nod*2+1].st,max(arb[nod*2].sol,arb[nod*2+1].sol));
arb[nod].st=arb[nod*2].st;
if(arb[nod].st==mid-st+1) arb[nod].st+=arb[nod*2+1].st;
arb[nod].dr=arb[nod*2+1].dr;
if(arb[nod].dr==dr-mid) arb[nod].dr+=arb[nod*2].dr;
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
int n,q,tip,l,r;
scanf("%d%d",&n,&q);
init(1,1,n);
for(int i=1;i<=q;i++)
{
scanf("%d",&tip);
if(tip==3) {propag(1,1,n);printf("%d\n",arb[1].sol);continue;}
scanf("%d%d",&l,&r);
r+=l-1;
update(1,1,n,l,r,tip);
}
return 0;
}