#include <fstream>
using namespace std;
ifstream fin ("hotel.in");
ofstream fout ("hotel.out");
const int Dim = 100001;
int AintM[Dim * 4], AintL[Dim * 4], AintR[Dim * 4],n,m,Lazy[Dim * 4];
void Propag(int nod, int st, int dr);
void Update_Lazy(int nod, int st, int dr, int x, int y, int val);
void Build (int nod, int st, int dr);
int main() {
fin >> n >> m;
Build(1,1,n);
int type;
int x,y;
for ( ; m > 0; --m) {
fin >> type;
if ( type == 3) {
Propag(1,1,n);
fout << AintM[1] << "\n";
continue;
}
fin >> x >> y;
y += x-1;
Update_Lazy(1,1,n,x,y,type);
}
}
void Update_Lazy(int nod, int st, int dr, int x, int y, int val) {
if ( st >= x and dr <= y) {
Lazy[nod] = val;
Propag(nod,st, dr);
return;
}
Propag(nod, st, dr);
int mj = (st + dr) / 2;
if ( mj >= x)
Update_Lazy(nod * 2, st, mj, x , y, val);
else
Propag(nod * 2, st, mj);
if ( mj < y)
Update_Lazy(2*nod + 1, mj + 1, dr, x, y, val);
else
Propag(nod * 2 + 1, mj + 1, dr);
AintM[nod] = max(AintR[nod * 2] + AintL[nod * 2+1], max(AintM[nod * 2], AintM[nod * 2 + 1]));
AintL[nod] = AintL[nod * 2];
if ( AintL[nod] == mj - st + 1)
AintL[nod] += AintL[nod * 2 + 1];
AintR[nod] = AintR[nod * 2 + 1];
if (AintR[nod] == dr - mj)
AintR[nod] += AintR[nod * 2];
}
void Propag(int nod, int st, int dr) {
if ( Lazy[nod] ) {
if ( Lazy[nod] == 2)
AintL[nod] = AintR[nod] = AintM[nod] = dr - st + 1;
else
AintL[nod] = AintR[nod] = AintM[nod] = 0;
if ( st != dr) {
Lazy[2 * nod] = Lazy[2 * nod + 1] =Lazy[nod];
}
Lazy[nod] = 0;
}
}
void Build (int nod, int st, int dr) {
AintL[nod]=AintR[nod]=AintM[nod] = dr - st +1;
if(st==dr)
return;
int mj=(st+dr)/2;
Build(2*nod, st, mj);
Build(2*nod+1, mj+1, dr);
}