#include <iostream>
#include <fstream>
using namespace std;
ifstream F("hotel.in");
ofstream G("hotel.out");
const int N = 100010;
struct node {
int l,r,mk,bst;
};
node a[N*4];
void update(int n,int l,int r,int il,int ir,int tp)
{
if ( r < il || l > ir )
return;
if ( il <= l && r <= ir )
{
a[n].mk = tp;
a[n].bst = a[n].l = a[n].r = tp == -1 ? 0 : r-l+1;
return;
}
int m = (l + r) / 2;
if ( a[n].mk != 0 )
{
a[n*2].mk = a[n*2+1].mk = a[n].mk;
a[n*2].bst = a[n*2].l = a[n*2].r = a[n].mk == -1 ? 0 : m-l+1;
a[n*2+1].bst = a[n*2+1].l = a[n*2+1].r = a[n].mk == -1 ? 0 : r-(m+1)+1;
a[n].mk = 0;
}
update(n*2,l,m,il,ir,tp);
update(n*2+1,m+1,r,il,ir,tp);
a[n].l = a[n*2].l == m-l+1 ? a[n*2].l + a[n*2+1].l : a[n*2].l;
a[n].r = a[n*2+1].r == r-(m+1)+1 ? a[n*2+1].r + a[n*2].r : a[n*2+1].r;
a[n].bst = max(a[n*2].bst,a[n*2+1].bst);
a[n].bst = max(a[n].bst,a[n*2].r+a[n*2+1].l);
}
int n,m;
int main()
{
F>>n>>m;
update(1,1,n,1,n,1);
for (int i=1,tp,l,r;i<=m;++i)
{
F>>tp;
if ( tp == 1 )
{
F>>l>>r;
r += l-1;
update(1,1,n,l,r,-1);
}
if ( tp == 2 )
{
F>>l>>r;
r += l-1;
update(1,1,n,l,r,1);
}
if ( tp == 3 )
{
G<<a[1].bst<<'\n';
}
}
}