#include <stdio.h>
#define MAXARB (1 << 18)
#define left (nod << 1)
#define right ((nod << 1) | 1)
#define mid ((st+dr) >> 1)
#define max(a,b) ((a) > (b) ? (a) : (b))
int N, P, L[MAXARB], R[MAXARB], Max[MAXARB], Nr[MAXARB];
int a, b, type;
void scoate(int nod, int st, int dr)
{
if(a <= st && dr <= b)
Max[nod] = L[nod] = R[nod] = 0;
else
{
if(a <= mid) scoate(left, st, mid);
if(b > mid) scoate(right, mid+1, dr);
Max[nod] = max(Max[left], Max[right]);
Max[nod] = max(Max[nod], L[right]+R[left]);
L[nod] = (L[left] == Nr[left] ? L[left]+L[right] : L[left]);
R[nod] = (R[right] == Nr[right] ? R[right]+R[left] : R[right]);
}
}
void baga(int nod, int st, int dr, int tata)
{
int lst = 0, ldr = 0, rst = 0, rdr = 0, mst = 0, mdr = 0;
if(a <= st && dr <= b)
Max[nod] = L[nod] = R[nod] = Nr[nod];
else
{
if(tata == 0 || Max[nod] == 0)
{
if(a <= mid)
baga(left, st, mid, 0), lst = L[left], rst = R[left],
mst = Max[left];
if(b > mid)
baga(right, mid+1, dr, 0), ldr = L[right], rdr = R[right],
mdr = Max[right];
Max[nod] = max(mst, mdr);
Max[nod] = max(Max[nod], ldr+rst);
L[nod] = (lst == Nr[left] ? lst+ldr : lst);
R[nod] = (rdr == Nr[right] ? rdr+rst : rdr);
}
else
{
if(a <= mid) baga(left, st, mid, 1);
if(b > mid) baga(right, mid+1, dr, 1);
Max[nod] = max(Max[left], Max[right]);
Max[nod] = max(Max[nod], L[right]+R[left]);
L[nod] = (L[left] == Nr[left] ? L[left]+L[right] : L[left]);
R[nod] = (R[right] == Nr[right] ? R[right]+R[left] : R[right]);
}
}
}
void init(int nod, int st, int dr)
{
Max[nod] = L[nod] = R[nod] = Nr[nod] = dr-st+1;
if(st == dr)
return ;
init(left, st, mid), init(right, mid+1, dr);
}
int main(void)
{
freopen("hotel.in", "rt", stdin);
freopen("hotel.out", "wt", stdout);
int i, t, j, k;
scanf("%d %d\n", &N, &P);
init(1, 1, N);
for(i = 1; i <= P; i++)
{
scanf("%d ", &t);
if(t == 1)
scanf("%d %d\n", &j, &k), a = j, b = j+k-1, scoate(1, 1, N);
if(t == 2)
scanf("%d %d\n", &j, &k), a = j, b = j+k-1, baga(1, 1, N, 1);
if(t == 3)
printf("%d\n", Max[1]);
}
return 0;
}