#include<iostream>
#include<fstream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<bitset>
#include<cstring>
#include<queue>
#define ull unsigned long long
#define ll long long
#define pb push_back
#define FOR(a,b,c) for (int a=b;a<=c; ++a)
#define ROF(a,b,c) for (int a=b;a>=c; --a)
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int N,P;
struct elem {
int left=0,best=0,right=0;
}arb[262150];
// arb[i].best= lungimea celui mai mare interval de camere libere pentru nodul i
// arb[i].left= lungimea celui mai mare interval de camere libere care incepe in st
// arb[i].right= lungimea celui mai mare interval de camere libere care se termina in dr
void update(int,int,int,int,int,int);
inline int maxim(int,int,int);
int main()
{
f>>N>>P;
update(1,1,N,1,N,2); // fac toate camerele libere
while (P--) {
short tip;
f>>tip;
if (tip==3) {
g<<arb[1].best<<'\n';
}
else {
int x,m;
f>>x>>m;
update(1,1,N,x,x+m-1,tip);
}
}
f.close();g.close();
return 0;
}
void update(int nod,int st,int dr,int a,int b,int val) { // update de interval pe arbore cu lazy update
if (a<=st && dr<=b) {
if (val==2) {
arb[nod].best=arb[nod].left=arb[nod].right=dr-st+1;
}
else {
arb[nod].best=arb[nod].left=arb[nod].right=0;
}
}
else {
int mij=(st+dr)>>1;
if (arb[nod].best==0) {
arb[(nod<<1)].left=arb[(nod<<1)].right=arb[(nod<<1)].best=arb[(nod<<1)+1].left=arb[(nod<<1)+1].best=arb[(nod<<1)+1].right=0;
}
else if (arb[nod].best==dr-st+1) {
arb[(nod<<1)].left=arb[(nod<<1)].right=arb[(nod<<1)].best=mij-st+1;
arb[(nod<<1)+1].left=arb[(nod<<1)+1].best=arb[(nod<<1)+1].right=dr-(mij+1)+1;
}
if (a<=mij) {
update((nod<<1),st,mij,a,b,val);
}
if (mij<b) {
update((nod<<1)+1,mij+1,dr,a,b,val);
}
arb[nod].left=arb[(nod<<1)].left;
if (arb[(nod<<1)].best==mij-st+1) {
arb[nod].left+=arb[(nod<<1)+1].left;
}
arb[nod].right=arb[(nod<<1)+1].right;
if (arb[(nod<<1)+1].best==dr-(mij+1)+1) {
arb[nod].right+=arb[(nod<<1)].right;
}
arb[nod].best=maxim(arb[(nod<<1)].right+arb[(nod<<1)+1].left,arb[(nod<<1)].best,arb[(nod<<1)+1].best);
}
}
inline int maxim(int a,int b, int c) {
if (a>=c && a>=b) {
return a;
}
if (b>=a && b>=c) {
return b;
}
return c;
}