using namespace std;
#include <algorithm>
#include <cstdio>
#include <string>
#define maxn 100001
#define DIM (1<<13)
#define common \
int m=(l+r)>>1, L=n<<1, R=L+1
char ax[DIM];
int poz;
int s[maxn*3], st[maxn*3], dr[maxn*3];
inline void cit(int &x)
{
x=0;
while(ax[poz]<'0' || ax[poz]>'9')
{
++poz;
if(poz==DIM) fread(ax, 1, DIM, stdin), poz=0;
}
while(ax[poz]>='0' &&ax[poz]<='9')
{
x=x*10+ax[poz]-'0';
++poz;
if(poz==DIM) fread(ax, 1, DIM, stdin), poz=0;
}
}
inline void update1(int n, int l, int r, int ql, int qr)
{
if(l==ql && r==qr)
{
s[n]=st[n]=dr[n]=0;
return ;
}
common;
if(s[n]==r-l+1)
{
s[L]=st[L]=dr[L]=m-l+1;
s[R]=st[R]=dr[R]=r-(m+1)+1;
}
if(ql<=m) update1(L, l, m, ql, min(qr, m));
if(qr>m) update1(R, m+1, r, max(ql, m+1), qr);
st[n]=st[L];
if(st[L]==m-l+1) st[n]+=st[R];
dr[n]=dr[R];
if(dr[R]==r-(m+1)+1) dr[n]+=dr[L];
s[n]=max(s[L], max(s[R], dr[L]+st[R]));
s[n]=max(s[n], max(st[n], dr[n]));
}
inline void update2(int n, int l, int r, int ql, int qr)
{
if(l==ql && qr==r)
{
s[n]=st[n]=dr[n]=r-l+1;
return ;
}
common;
if(s[n]==0)
{
s[L]=s[R]=st[L]=st[R]=dr[L]=dr[R]=0;
}
if(ql<=m) update2(L, l, m, ql, min(qr, m));
if(qr>m) update2(R, m+1, r, max(ql, m+1), qr);
st[n]=st[L];
if(st[L]==m-l+1) st[n]+=st[R];
dr[n]=dr[R];
if(dr[R]==r-(m+1)+1) dr[n]+=dr[L];
s[n]=max(s[L], max(s[R], dr[L]+st[R]));
s[n]=max(s[n], max(st[n], dr[n]));
}
inline void scrie(int x)
{
char lin[30], *s;
s=lin+29; s[0]=0;
do{
int cat=x/10;
--s;
s[0]=x-cat*10+'0';
x=cat;
}while(x);
puts(s);
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
int n, m,i, t, p, q;
cit(n); cit(m);
// scanf("%d %d\n", &n, &m);
update2(1, 1, n, 1,n);
while(m--)
{
cit(t);
//scanf("%d ", &t);
if(t==1)
{
cit(p);cit(q);
// scanf("%d %d\n", &p, &q);
update1(1, 1, n, p, p+q-1);
}
if(t==2)
{
cit(p);cit(q);
//scanf("%d %d\n", &p, &q);
update2(1, 1, n, p, p+q-1);
}
if(t==3)
scrie(s[1]);
// printf("%d\n", s[1]);
}
return 0;
}