#include <stdio.h>
#include <iostream>
using namespace std;
FILE *in,*out;
int n,m,p,lf,rg,val;
struct name{
int gol,l,r,occ;
}v[400002];
void read(){
fscanf(in,"%d %d",&n,&p);
}
void update(int node, int left,int right){
if(left==right && left>=lf && right<=rg){
v[node].occ=val;
if(val)
v[node].l=v[node].r=v[node].gol=0;
else
v[node].l=v[node].r=v[node].gol=right-left+1;
return;
}
int mijint=(left+right)/2;
if(rg<=mijint)
update(node*2,left,mijint);
else if(lf>mijint)
update(node*2+1,mijint+1,right);
else if(lf<=mijint && rg>mijint){
update(node*2,left,mijint);
update(node*2+1,mijint+1,right);
}
v[node].gol=max(max(v[node*2].gol,v[node*2+1].gol),v[node*2].r+v[node*2+1].l);
v[node].l=v[node*2].l;
if(v[node*2].l==mijint-left+1)
v[node].l+=v[node*2+1].l;
v[node].r=v[node*2+1].r;
if(v[node*2+1].r==right-mijint)
v[node].r+=v[node*2].r;
}
void actual(int node,int left,int right){
if(node>3*n)
return;
v[node].gol=v[node].l=v[node].r=right-left+1;
int mij=(left+right)/2;
actual(node*2,left,mij);
actual(node*2+1,mij+1,right);
}
void solve(){
int c;
v[1].gol=n;
actual(1,1,n);
for(int i=1;i<=p;i++){
fscanf(in,"%d",&c);
if(c==1){
fscanf(in,"%d %d",&lf,&rg);
rg=lf+rg-1;
val=1;
update(1,1,n);
}
else if(c==2){
fscanf(in,"%d %d",&lf,&rg);
rg=lf+rg-1;
val=0;
update(1,1,n);
}
else{
fprintf(out,"%d\n",v[1].gol);
}
}
}
int main(){
in=fopen("hotel.in","r");
out=fopen("hotel.out","w");
read();
solve();
return 0;
}