#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
const int NMAX=1e5+5;
int n, p;
struct tree_node{
int pref, suf, scmax, full, len, flag;
} aint[4*NMAX];
tree_node combine(tree_node left, tree_node right){
tree_node rez;
rez.flag=0;
rez.len=left.len+right.len;
rez.pref=left.pref, rez.suf=right.suf;
rez.scmax=rez.full=0;
if(left.full && right.full){
rez.full=1;
}
if(left.full)
rez.pref=left.len+right.pref;
if(right.full)
rez.suf=left.suf+right.len;
rez.scmax=max(max(left.scmax, right.scmax), left.suf+right.pref);
// cout<<rez.len<<" "<<rez.scmax<<'\n';
return rez;
}
void build(int nod, int st, int dr){
if(st==dr){
aint[nod].full=aint[nod].len=aint[nod].scmax=aint[nod].pref=aint[nod].suf=1;
}else{
int mij=(st+dr)/2;
build(2*nod, st, mij);
build(2*nod+1, mij+1, dr);
aint[nod]=combine(aint[2*nod], aint[2*nod+1]);
}
}
void lazy_propag(int nod){
if(aint[nod].flag==-1){
aint[2*nod].full=aint[2*nod].scmax=aint[2*nod].pref=aint[2*nod].suf=0;
aint[2*nod+1].full=aint[2*nod+1].scmax=aint[2*nod+1].pref=aint[2*nod+1].suf=0;
}else{
aint[2*nod].full=1;
aint[2*nod].scmax=aint[2*nod].pref=aint[2*nod].suf=aint[2*nod].len;
aint[2*nod+1].full=1;
aint[2*nod+1].scmax=aint[2*nod+1].pref=aint[2*nod+1].suf=aint[2*nod+1].len;
}
aint[2*nod].flag=aint[nod].flag;
aint[2*nod+1].flag=aint[nod].flag;
aint[nod].flag=0;
}
void update(int nod, int st, int dr, int a, int b, int x){
if(a<=st && dr<=b){
if(x==-1){
aint[nod].full=aint[nod].scmax=aint[nod].pref=aint[nod].suf=0;
}else{
aint[nod].full=1;
aint[nod].scmax=aint[nod].pref=aint[nod].suf=aint[nod].len;
}
aint[nod].flag=x;
// cout<<"wasd:"<<st<<" "<<dr<<" "<<x<<" "<<aint[nod].scmax<<'\n';
}else{
if(aint[nod].flag!=0)
lazy_propag(nod);
// cout<<nod<<" "<<st<<" "<<dr<<"\n";
int mij=(st+dr)/2;
if(a<=mij)
update(2*nod, st, mij, a, b, x);
if(mij<b)
update(2*nod+1, mij+1, dr, a, b, x);
aint[nod]=combine(aint[2*nod], aint[2*nod+1]);
// cout<<aint[nod].scmax<<" "<<aint[2*nod].scmax<<" "<<aint[2*nod+1].scmax<<'\n';
}
}
int main()
{
fin>>n>>p;
build(1, 1, n);
int t, a, b;
while(p--){
fin>>t;
if(t==1){
fin>>a>>b;
// cout<<a<<" "<<a+b-1<<'\n';
update(1, 1, n, a, a+b-1, -1);
}
if(t==2){
fin>>a>>b;
update(1, 1, n, a, a+b-1, 1);
}
if(t==3){
fout<<aint[1].scmax<<'\n';
}
}
return 0;
}