#include<cstdio>
using namespace std;
int n,k,i,a,b,st,dr,c,lg_curr[300010],lg_left[300010],lg_right[300010];
void read(),solve(),vin(int,int,int),pleaca(int,int,int);
int main()
{
read();
solve();
return 0;
}
void read()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&n,&k);
}
void solve()
{
a=1;b=n;
pleaca(1,1,n);
for(;k--;)
{
scanf("%d",&c);
if(c==3)
{
printf("%d\n",lg_curr[1]);
continue;
}
scanf("%d%d",&a,&b);b+=a;
if(c==1){vin(1,1,n);continue;}
if(c==2){pleaca(1,1,n);continue;}
}
}
void vin(int nod,int st,int dr)
{
if(a<=st&&st<=b&&st==dr)
{
lg_curr[nod]=0;
lg_left[nod]=0;
lg_right[nod]=0;
return;
}
int mid=(st+dr)/2;
if(a<=mid)vin(nod*2,st,mid);
if(mid<b)vin(nod*2+1,mid+1,dr);
lg_curr[nod]=lg_curr[nod*2]>lg_curr[nod*2+1]?lg_curr[nod*2]:lg_curr[nod*2];
if(lg_right[nod*2]+lg_left[nod*2+1]>lg_curr[nod])
lg_curr[nod]=lg_right[nod*2]+lg_left[nod*2+1];
lg_left[nod]=lg_left[nod*2];
if(lg_left[nod]==mid-st+1)
lg_left[nod]+=lg_left[nod*2+1];
lg_right[nod]=lg_right[nod*2+1];
if(lg_right[nod]==dr-mid)
lg_right[nod]+=lg_right[nod*2];
}
void pleaca(int nod, int st, int dr)
{
if(a<=st&&st<=b&&st==dr)
{
lg_curr[nod]=1;
lg_left[nod]=1;
lg_right[nod]=1;
return;
}
int mid=(st+dr)/2;
if(a<=mid)pleaca(nod*2,st,mid);
if(mid<b)pleaca(nod*2+1,mid+1,dr);
lg_curr[nod]=lg_curr[nod*2]>lg_curr[nod*2+1]?lg_curr[nod*2]:lg_curr[nod*2];
if(lg_right[nod*2]+lg_left[nod*2+1]>lg_curr[nod])
lg_curr[nod]=lg_right[nod*2]+lg_left[nod*2+1];
lg_left[nod]=lg_left[nod*2];
if(lg_left[nod]==mid-st+1)
lg_left[nod]+=lg_left[nod*2+1];
lg_right[nod]=lg_right[nod*2+1];
if(lg_right[nod]==dr-mid)
lg_right[nod]+=lg_right[nod*2];
}