#include <fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct swag
{ int best,r,l;
};
swag a[400005];
int n,p,narb=1,op;
void update(int nd,int x,int y,int st,int dr)
{ // fout<<nd<<" "<<x<<" "<<y<<" "<<st<<" "<<dr<<"\n";
if(x==st && y==dr)
{ if(op==1) a[nd].best=a[nd].l=a[nd].r=0;
else a[nd].best=a[nd].l=a[nd].r=dr-st+1;
//fout<<nd<<" "<<dr-st+1<<" "<<op<<"\n";
int mijl=(st+dr)/2;
if(st!=dr)
{update(2*nd,x,mijl,st,mijl);
update(2*nd+1,mijl+1,y,mijl+1,dr);
}
return;
}
int mijl=(st+dr)/2;
if(y<=mijl)
update(2*nd,x,y,st,mijl);
else
if(x>mijl)
update(2*nd+1,x,y,mijl+1,dr);
else
{ update(2*nd,x,mijl,st,mijl);
update(2*nd+1,mijl+1,y,mijl+1,dr);
}
a[nd].best=max(max(a[2*nd].best,a[2*nd+1].best),a[2*nd].r+a[2*nd+1].l);
a[nd].l=a[2*nd].l;
a[nd].r=a[2*nd+1].r;
if(a[nd].l==mijl-st+1)
a[nd].l+=a[2*nd+1].l;
if(a[nd].r==dr-mijl)
a[nd].r+=a[2*nd].r;
}
int main()
{
fin>>n>>p;
while(narb<n) narb*=2;
int i,x,y;
for(i=0;i<n;++i)
a[narb+i].best=a[narb+i].l=a[narb+i].r=1;
for(i=narb-1;i>=1;--i)
a[i].best=a[i].r=a[i].l=a[i*2].r+a[i*2+1].l;
for(i=1;i<=p;++i)
{ fin>>op;
if(op==3)
fout<<a[1].best<<"\n";
else
{fin>>x>>y;
y+=x-1;
update(1,x,y,1,narb);
// fout<<"\n";
}
}
return 0;
}