#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct NODE {
int secv,pref,suf;
};
//int v[200001];
vector <NODE> segtree(400001);
vector <int> lazy(400001);
int n,m;
void update_plus(int a,int b,int start,int end,int node) {
int mij=(start+end)/2;
if (a<=start && end<=b) {
lazy[node]=1;
return;
}
if (a<=mij) {
update_plus(a,b,start,mij,2*node);;
}
if (b>mij) {
update_plus(a,b,mij+1,end,2*node+1);
}
}
void update_minus(int a,int b,int start,int end,int node) {
int mij=(start+end)/2;
if (a<=start && end<=b) {
lazy[node]=0;
if (node<n) {
lazy[2*node]=0;
lazy[2*node+1]=0;
}
return;
}
if (a<=mij) {
update_plus(a,b,start,mij,2*node);;
}
if (b>mij) {
update_plus(a,b,mij+1,end,2*node+1);
}
}
int query(int start,int end,int node) {
int mij=(start+end)/2;
if (start==end) {
if (lazy[node]==1) {
segtree[node].pref=1;
segtree[node].suf=1;
segtree[node].secv=1;
}
return segtree[node].secv;
}else {
if (lazy[node]==1) {
lazy[2*node]=1;
lazy[2*node+1]=1;
lazy[node]=2;
}
}
query(start,mij,2*node);
query(mij+1,end,2*node+1);
segtree[node].pref=segtree[2*node].pref;
segtree[node].suf=segtree[2*node+1].suf;
segtree[node].secv=segtree[2*node].secv;
if (segtree[node].secv<segtree[2*node+1].secv) {
segtree[node].secv=segtree[2*node+1].secv;
}
if (segtree[2*node].suf+segtree[2*node+1].pref>segtree[node].secv) {
segtree[node].secv= segtree[2*node].suf+segtree[2*node+1].pref;
}
}
int main() {
fin>>n>>m;
int aux=log2(n);
n=pow(2,(aux+1));
for (int i=1;i<=m;i++) {
int cer;
fin >> cer;
if (cer==1) {
int a,b;
fin >> a >> b;
update_plus(a,a+b-1,1,n,1);
}else if (cer==2){
int a,b;
fin >> a >> b;
update_minus(a,a+b-1,1,n,1);
}else {
fout << query(1,n,1);
}
}
return 0;
}