#include <cstdio>
#include <cstdlib>
#define N 100001
#define common int m=(l+r)>>1, L=n<<1, R=L+1
struct nod { int s, st, dr;nod(){}; nod(int a){s=a; st=a; dr=a;};};
nod a[3*N];
int n, m;
inline int min(int a, int b)
{
if(a<b)return a;
return b;
}
inline int max(int a,int b)
{
if(a>b)return a;
return b;
}
inline void update1(int n,int l, int r, int ql, int qr)
{
if(l==ql && r==qr)
{
a[n]=nod(0);
return ;
}
common;
if(a[n].s==r-l+1)
{
a[L]=nod(m-l+1);
a[R]=nod(r-(m+1)+1);
a[n]=nod(0);
}
if(ql<=m) update1(L, l, m, ql, min(qr, m));
if(qr>m) update1(R, m+1, r, max(ql, m+1), qr);
a[n].st=a[L].st;
if(a[L].st==m-l+1) a[n].st+=a[R].st;
a[n].dr=a[R].dr;
if(a[R].dr==r-(m+1)+1) a[n].dr+=a[L].dr;
a[n].s=max(max(a[L].s, a[R].s), max(a[L].dr+a[R].st, max(a[n].st, a[n].dr)));
}
inline void update2(int n, int l, int r, int ql, int qr)
{
if(l==ql && r==qr)
{
a[n]=nod(r-l+1);
return;
}
common;
if(a[n].s==0)
{
a[L]=a[R]=nod(0);
a[n]=(r-l+1);
}
if(ql<=m) update2(L, l, m, ql, min(qr, m));
if(qr>m) update2(R, m+1, r, max(ql, m+1), qr);
a[n].st=a[L].st;
if(a[L].st==m-l+1) a[n].st+=a[R].st;
a[n].dr==a[R].dr;
if(a[R].dr==r-(m+1)+1) a[n].dr+=a[L].dr;
a[n].s=max(max(a[L].s, a[R].s), max(a[L].dr+a[R].st, max(a[n].st, a[n].dr)));
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d %d\n", &n, &m);
int t, p, q;
update2(1, 1, n, 1, n);
while(m--)
{
scanf("%d ", &t);
if(t==3) printf("%d\n", a[1].s);
if(t==1)
{
scanf("%d %d\n", &p, &q);
update1(1, 1, n, p, p+q-1);
}
if(t==2)
{
scanf("%d %d\n", &p, &q);
update2(1, 1, n, p, p+q-1);
}
}
return 0;
}