#include <stdio.h>
#define max(a,b) (a)>(b)?(a):(b)
#define Nmax 4*100000 + 1
long C[Nmax], R[Nmax], L[Nmax];
long n,p,type,a,b;
void up1(long, long, long, long, long);
void up2(long, long, long, long, long);
void init(long, long, long);
int main()
{
long i;
freopen("hotel.in", "r", stdin);
freopen("hotel.out", "w", stdout);
scanf("%ld %ld", &n, &p);
init(1,1,n);
for (i = 1; i<=p; i++)
{
scanf("%ld", &type);
if (type == 3)
{
printf("%ld\n", C[1]);
}
else
{
scanf("%ld %ld", &a, &b);
if (type == 2)
up2(1,1,n,a,a+b-1);
else
up1(1,1,n,a,a+b-1);
}
}
return 0;
}
void init(long cs, long e, long v)
{
C[cs] = R[cs] = L[cs] = v-e+1;
}
void up1(long cs, long e, long v, long a, long b)
{
long k = (e+v)/2;
long m1;
if (a<=e && b>=v)
{
C[cs] = L[cs] = R[cs] = 0;
return;
}
if (C[cs] == v-e+1)
{
L[2*cs] = R[2*cs] = C[2*cs] = k-e+1;
R[2*cs+1] = L[2*cs+1] = C[2*cs+1] = v-k;
}
if (a<=k)
up1(2*cs, e, k, a, b);
if (b>k)
up1(2*cs+1, k+1, v, a, b);
L[cs] = L[2*cs];
if (L[2*cs] == k-e+1)
L[cs] += L[2*cs+1];
R[cs] = R[2*cs+1];
if (R[2*cs+1] == v-k)
R[cs] += R[2*cs];
m1 = max(C[2*cs], C[2*cs+1]);
m1 = max(m1, L[2*cs+1]+R[2*cs]);
m1 = max(m1, max(L[cs], R[cs]));
C[cs] = m1;
}
void up2(long cs, long e, long v, long a, long b)
{
long k = (e+v)/2;
long m1;
if (a<=e && b>=v)
{
C[cs] = L[cs] = R[cs] = v-e+1;
return;
}
if (C[cs] == v-e+1)
{
L[2*cs] = R[2*cs] = C[2*cs] = k-e+1;
R[2*cs+1] = L[2*cs+1] = C[2*cs+1] = v-k;
}
if (a<=k)
up2(2*cs, e, k, a, b);
if (b>k)
up2(2*cs+1, k+1, v, a, b);
L[cs] = L[2*cs];
if (L[2*cs] == k-e+1)
L[cs] += L[2*cs+1];
R[cs] = R[2*cs+1];
if (R[2*cs+1] == v-k)
R[cs] += R[2*cs];
m1 = max(C[2*cs], C[2*cs+1]);
m1 = max(m1, L[2*cs+1]+R[2*cs]);
m1 = max(m1, max(L[cs], R[cs]));
C[cs] = m1;
}