#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
#define nmax 100005
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int n,p;
struct arbore
{
int st,mij,dr;
} arb[4*nmax];
int lazy[4*nmax];
int cerinta;
void creez(int nod,int st,int dr,int pos)
{
if(st==dr)
{
if(!(nod&1))
{
arb[nod].st=0;
arb[nod].mij=1;
arb[nod].dr=1;
return;
}
else
{
arb[nod].st=1;
arb[nod].mij=1;
arb[nod].dr=0;
return;
}
}
else
{
int mid=(st+dr)/2;
int f_st=2*nod;
int f_dr=2*nod+1;
if(pos<=mid)
creez(f_st,st,mid,pos);
else if(pos>mid)
creez(f_dr,mid+1,dr,pos);
arb[nod].st=max(max(arb[f_st].st,arb[f_st].mij),arb[f_st].dr);
arb[nod].dr=max(max(arb[f_dr].st,arb[f_dr].mij),arb[f_dr].dr);
if(arb[f_st].dr+arb[f_st].st==arb[f_st].mij)
if(arb[f_dr].dr+arb[f_dr].st==arb[f_dr].mij)
arb[nod].mij=arb[f_st].mij+arb[f_dr].mij;
else arb[nod].mij=arb[f_st].mij+arb[f_dr].st;
else
{
if(arb[f_dr].dr+arb[f_dr].st==arb[f_dr].mij)
arb[nod].mij=arb[f_st].dr+arb[f_dr].mij;
else arb[nod].mij=arb[f_st].dr+arb[f_dr].st;
}
}
}
void propag(int nod,int st,int dr)
{
if(lazy[nod]==0)
return;
if(lazy[nod]==1)
{
if(dr-st==2){
if(nod&1){
arb[nod].st=1;
arb[nod].mij=1;
arb[nod].dr=0;}
}
else if(dr-st<=1){
if(!(nod&1))
{
arb[nod].st=0;
arb[nod].mij=1;
arb[nod].dr=1;
}
else
{
arb[nod].st=1;
arb[nod].mij=1;
arb[nod].dr=0;
}
}
else{
arb[nod].st=dr-st+1;
arb[nod].dr=dr-st+1;
arb[nod].mij=arb[nod].st+arb[nod].dr;
}
}
else if(lazy[nod]==2)
{
arb[nod].st=0;
arb[nod].dr=0;
arb[nod].mij=0;
}
if(st!=dr)
{
lazy[2*nod]=lazy[nod];
lazy[2*nod+1]=lazy[nod];
}
lazy[nod]=0;
}
void pune(int nod,int st,int dr,int ST,int DR)
{
propag(nod,st,dr);
if(st>=ST && dr<=DR)
{
lazy[nod]=2;
return;
}
int mid=(st+dr)/2;
int f_st=2*nod;
int f_dr=2*nod+1;
if(ST<=mid)
pune(f_st,st,mid,ST,DR);
if(DR>mid)
pune(f_dr,mid+1,dr,ST,DR);
propag(f_st,st,dr);
propag(f_dr,st,dr);
arb[nod].st=max(max(arb[f_st].st,arb[f_st].mij),arb[f_st].dr);
arb[nod].dr=max(max(arb[f_dr].st,arb[f_dr].mij),arb[f_dr].dr);
if(arb[f_st].dr==0)
if(arb[f_dr].st!=0)
if(arb[f_dr].dr+arb[f_dr].st==arb[f_dr].mij)
arb[nod].mij=arb[f_dr].mij;
else arb[nod].mij=arb[f_dr].st;
else arb[nod].mij=0;
else if(arb[f_st].dr+arb[f_st].st==arb[f_st].mij)
if(arb[f_dr].st!=0)
if(arb[f_dr].dr+arb[f_dr].st==arb[f_dr].mij)
arb[nod].mij=arb[f_st].mij+arb[f_dr].mij;
else arb[nod].mij=arb[f_st].mij+arb[f_dr].st;
else arb[nod].mij=arb[f_st].mij;
else
{
if(arb[f_dr].dr+arb[f_dr].st==arb[f_dr].mij)
arb[nod].mij=arb[f_st].dr+arb[f_dr].mij;
else arb[nod].mij=arb[f_st].dr+arb[f_dr].st;
}
}
void scoate(int nod,int st,int dr,int ST,int DR)
{
propag(nod,st,dr);
if(st>=ST && dr<=DR)
{
lazy[nod]=1;
return;
}
int mid=(st+dr)/2;
int f_st=2*nod;
int f_dr=2*nod+1;
if(ST<=mid)
scoate(f_st,st,mid,ST,DR);
if(DR>mid)
scoate(f_dr,mid+1,dr,ST,DR);
propag(f_st,st,dr);
propag(f_dr,st,dr);
arb[nod].st=max(max(arb[f_st].st,arb[f_st].mij),arb[f_st].dr);
arb[nod].dr=max(max(arb[f_dr].st,arb[f_dr].mij),arb[f_dr].dr);
if(arb[f_st].dr==0)
if(arb[f_dr].st!=0)
if(arb[f_dr].dr+arb[f_dr].st==arb[f_dr].mij)
arb[nod].mij=arb[f_dr].mij;
else arb[nod].mij=arb[f_dr].st;
else arb[nod].mij=0;
else if(arb[f_st].dr+arb[f_st].st==arb[f_st].mij)
if(arb[f_dr].st!=0)
if(arb[f_dr].dr+arb[f_dr].st==arb[f_dr].mij)
arb[nod].mij=arb[f_st].mij+arb[f_dr].mij;
else arb[nod].mij=arb[f_st].mij+arb[f_dr].st;
else arb[nod].mij=arb[f_st].mij;
else
{
if(arb[f_dr].dr+arb[f_dr].st==arb[f_dr].mij)
arb[nod].mij=arb[f_st].dr+arb[f_dr].mij;
else arb[nod].mij=arb[f_st].dr+arb[f_dr].st;
}
}
void citire()
{
fin>>n>>p;
int st,dr;
for(int i=1; i<=n; ++i)
creez(1,1,n,i);
while(p)
{
fin>>cerinta;
if(cerinta==3)
{
propag(1,1,n);
fout<<max(max(arb[1].st,arb[1].dr),arb[1].mij)<<'\n';
}
else if(cerinta==2)
{
fin>>st>>dr;
dr=dr+st-1;
scoate(1,1,n,st,dr);
}
else if(cerinta==1)
{
fin>>st>>dr;
dr=dr+st-1;
pune(1,1,n,st,dr);
}
p--;
}
}
int main()
{
citire();
return 0;
}