#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>
#define INF ( (1 << 30) - 1 + (1 << 30) )
#define mod 666013
using namespace std;
struct arbint
{
int st;
int dr;
int scv;
int lzy;
}aint[400005];
int n, m, x, y, op;
void B(int, int, int);
void U0(int, int, int, int, int);
void U1(int, int, int, int, int);
void uLzy(int, int, int, int);
arbint C(arbint, arbint, int, int, int);
int Q();
void B(int nod, int st, int dr)
{
if(st == dr)
{
aint[nod].st = aint[nod].dr = aint[nod].scv = 1;
aint[nod].lzy = -1;
return;
}
int mij = st + ( (dr - st) >> 1 );
B(nod << 1, st, mij);
B((nod << 1) + 1, mij + 1, dr);
aint[nod].lzy = -1;
aint[nod].st = aint[nod].dr = aint[nod].scv = dr - st + 1;
}
void U0(int nod, int st, int dr, int sti, int dri)
{
if(st == dr)
{
aint[nod].st = aint[nod].dr = aint[nod].scv = 0;
return;
}
if(sti <= st && dr <= dri)
{
aint[nod].st = aint[nod].dr = aint[nod].scv = 0;
aint[nod].lzy = 0;
return;
}
int mij = st + ( (dr - st) >> 1 );
uLzy(nod, st, mij, dr);
if(sti <= mij)
U0(nod * 2, st, mij, sti, dri);
if(mij + 1 <= dri)
U0(nod * 2 + 1, mij + 1, dr, sti, dri);
aint[nod] = C(aint[nod * 2], aint[nod * 2 + 1], st, mij, dr);
}
void U1(int nod, int st, int dr, int sti, int dri)
{
if(st == dr)
{
aint[nod].st = aint[nod].dr = aint[nod].scv = 1;
return;
}
if(sti <= st && dr <= dri)
{
aint[nod].st = aint[nod].dr = aint[nod].scv = dr - st + 1;
aint[nod].lzy = 1;
return;
}
int mij = st + ( (dr - st) >> 1 );
uLzy(nod, st, mij, dr);
if(sti <= mij)
U1(nod * 2, st, mij, sti, dri);
if(mij + 1 <= dri)
U1(nod * 2 + 1, mij + 1, dr, sti, dri);
aint[nod] = C(aint[nod * 2], aint[nod * 2 + 1], st, mij, dr);
}
int Q()
{
return aint[1].scv;
}
arbint C(arbint lft, arbint rgt, int st, int mij, int dr)
{
arbint rez;
rez.lzy = -1;
rez.st = lft.st;
if(rez.st == mij - st + 1)
rez.st = lft.st + rgt.st;
rez.dr = rgt.dr;
if(rgt.dr == dr - mij)
rez.dr = rgt.dr + lft.dr;
rez.scv = max(rez.st, rez.dr);
rez.scv = max(rez.scv, lft.dr + rgt.st);
return rez;
}
void uLzy(int nod, int st, int mij, int dr)
{
if(aint[nod].lzy == -1)
return;
if(aint[nod].lzy == 0)
{
aint[nod].lzy = -1;
U0(nod * 2, st, mij, st, mij);
U0(nod * 2 + 1, mij + 1, dr, mij + 1, dr);
return;
}
if(aint[nod].lzy == 1)
{
aint[nod].lzy = -1;
U1(nod * 2, st, mij, st, mij);
U1(nod * 2 + 1, mij + 1, dr, mij + 1, dr);
return;
}
}
int main()
{
freopen("hotel.in", "r", stdin);
freopen("hotel.out", "w", stdout);
scanf("%d%d", &n, &m);
B(1, 1, n);
while( m-- )
{
scanf("%d", &op);
if(op == 1)
{
scanf("%d%d", &x, &y);
U0(1, 1, n, x, x + y - 1);
}
else if(op == 2)
{
scanf("%d%d", &x, &y);
U1(1, 1, n, x, x + y - 1);
}
else
printf("%d\n", Q());
}
return 0;
}