#include <cstdio>
#include <cctype>
#define MAXBUF (1<<20)
#define MAXN 100000
FILE*fi,*fout;
char buf[MAXBUF];
int pos=MAXBUF;
inline char nextch(){
if(pos==MAXBUF){
fread(buf,1,MAXBUF,fi);
pos=0;
}
return buf[pos++];
}
inline int getnr(){
char a=nextch();
char sign=1;
if(a=='-')
sign=-1;
while(isdigit(a)==0)
a=nextch();
int nr=0;
while(isdigit(a)==1){
nr=nr*10+a-'0';
a=nextch();
}
return nr*sign;
}
inline int getmax(int a,int b){
if(a>b) return a;
return b;
}
struct Aint{
int max_lenght;
int first_lenght;
int last_lenght;
inline void reset(int val){
max_lenght=first_lenght=last_lenght=val;
}
};
Aint A[4*MAXN+1];
void update(int nod,int left,int right,int l,int r,char free){
if(l<=left&&right<=r){
if(free==1)
A[nod].reset(right-left+1);
else
A[nod].reset(0);
}
else{
int med=(left+right)/2;
if(A[nod].max_lenght==0){
A[2*nod].reset(0);
A[2*nod+1].reset(0);
}
if(A[nod].max_lenght==right-left+1){
A[2*nod].reset(med-left+1);
A[2*nod+1].reset(right-med);
}
if(l<=med)
update(2*nod,left,med,l,r,free);
if(med<r)
update(2*nod+1,med+1,right,l,r,free);
A[nod].max_lenght=getmax(A[2*nod].last_lenght+A[2*nod+1].first_lenght,getmax(A[2*nod].max_lenght,A[2*nod+1].max_lenght));
if(A[2*nod].first_lenght==med-left+1)
A[nod].first_lenght=A[2*nod].first_lenght+A[2*nod+1].first_lenght;
else
A[nod].first_lenght=A[2*nod].first_lenght;
if(A[2*nod+1].last_lenght==right-med)
A[nod].last_lenght=A[2*nod].last_lenght+A[2*nod+1].last_lenght;
else
A[nod].last_lenght=A[2*nod+1].last_lenght;
}
}
int main(){
int i,n,l,x,q,t;
fi=fopen("hotel.in" ,"r");
fout=fopen("hotel.out" ,"w");
n=getnr();
for(i=1;i<=n;i++)
update(1,1,n,i,i,1);
q=getnr();
while(q>0){
q--;
t=getnr();
if(t==1){
l=getnr();
x=getnr();
update(1,1,n,l,l+x-1,0);
}
if(t==2){
l=getnr();
x=getnr();
update(1,1,n,l,l+x-1,1);
}
if(t==3)
fprintf(fout,"%d\n" ,A[1].max_lenght);
}
fclose(fi);
fclose(fout);
return 0;
}