#include <cstdio>
using namespace std;
const int N=100005;
struct nod{
int sum,lazy;
} v[4*N];
int n,maxx,in,sf;
void propagation(int pos, int st, int dr){
v[2*pos].lazy+=v[pos].lazy;
v[2*pos+1].lazy+=v[pos].lazy;
v[2*pos].sum+=((st+dr)/2-st+1)*v[pos].lazy;
v[2*pos+1].sum+=(dr-(st+dr)/2)*v[pos].lazy;
v[pos].lazy=0;
}
void update(int pos, int st, int dr, int a, int b, int val){
if(st>b or dr<a) return;
if(a<=st and dr<=b){
v[pos].lazy+=val;
v[pos].sum+=(dr-st+1)*val;
}
if(2*pos+1>4*n){
v[pos].lazy=0;
return;
}
propagation(pos,st,dr);
if(a<=st and dr<=b) return;
update(2*pos, st, (st+dr)/2, a, b, val);
update(2*pos+1, (st+dr)/2+1, dr, a, b, val);
v[pos].sum=v[2*pos].sum+v[2*pos+1].sum;
}
void query(int pos, int st, int dr){
propagation(pos,st,dr);
if(v[pos].sum==0){
if(st==sf+1){
sf=dr;
return;
}
else{
if((sf-in+1)>maxx) maxx=sf-in+1;
in=st, sf=dr;
return;
}
}
else{
if(st==dr) return;
query(2*pos, st, (st+dr)/2);
query(2*pos+1, (st+dr)/2+1, dr);
}
}
int main(){
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
int m,t,i,a,b,dist;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
scanf("%d",&t);
if(t==1){
scanf("%d%d",&a,&dist);
b=a+dist-1;
update(1,1,n,a,b,1);
}
if(t==2){
scanf("%d%d",&a,&dist);
b=a+dist-1;
update(1,1,n,a,b,-1);
}
if(t==3){
maxx=0, in=5, sf=-5;
query(1,1,n);
if(sf-in+1>maxx) maxx=sf-in+1;
printf("%d\n",maxx);
}
/*for(int j=1;j<=5;j++) printf("%d ",v[j].sum);
printf("\n");*/
}
return 0;
}