#include<cstdio>
#include<algorithm>
using namespace std;
struct Mytype
{
int sf,st,lmax,val;
};
Mytype h[262145];
void fill(int xq,int yq,int v,int p,int x,int y)
{
//printf("> %d %d %d %d %d %d %d %d %d %d\n", xq, yq, v, p, x, y, h[p].lmax, h[p].st, h[p].sf, h[p].val);
if(xq==x&&yq==y)
{
h[p].val=v;
h[p].sf=v*(y-x+1);
h[p].st=v*(y-x+1);
h[p].lmax=v*(y-x+1);
}
else
{
int med=(x+y)/2;
if(h[p].val!=2)
{
h[2*p].val=h[p].val;
h[2*p].sf=h[p].val*(med-x+1);
h[2*p].st=h[p].val*(med-x+1);
h[2*p].lmax=h[p].val*(med-x+1);
h[2*p+1].val=h[p].val;
h[2*p+1].sf=h[p].val*(y-med);
h[2*p+1].st=h[p].val*(y-med);
h[2*p+1].lmax=h[p].val*(y-med);
}
if(yq<=med)
{
fill(xq,yq,v,2*p,x,med);
}
else if(xq>med)
{
fill(xq,yq,v,2*p+1,med+1,y);
}
else
{
fill(xq,med,v,2*p,x,med);
fill(med+1,yq,v,2*p+1,med+1,y);
}
//CALCULARE:
if(h[2*p].val==h[2*p+1].val)
{
h[p].val=h[2*p].val;
}
else
{
h[p].val=2;
}
h[p].lmax=max(h[2*p].sf+h[2*p+1].st,h[2*p].lmax);
h[p].lmax=max(h[p].lmax,h[2*p+1].lmax);
h[p].sf=h[2*p+1].sf;
if(h[2*p+1].val==1)
h[p].sf+=h[2*p].sf;
h[p].st=h[2*p].st;
if(h[2*p].val==1)
h[p].st+=h[2*p+1].st;
}
//printf("< %d %d %d %d %d %d %d %d %d %d\n", xq, yq, v, p, x, y, h[p].lmax, h[p].st, h[p].sf, h[p].val);
}
int query()
{
return h[1].lmax;
}
int main()
{
int n,q,i,op,x,y;
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d%d",&n,&q);
fill(1,n,1,1,1,n);
for(i=1; i<=q; i++)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d%d",&x,&y);
y=x+y-1;
fill(x,y,0,1,1,n);
}
else if(op==2)
{
scanf("%d%d",&x,&y);
y=x+y-1;
fill(x,y,1,1,1,n);
}
else
{
printf("%d\n",query());
}
}
}