#include <iostream>
#include <fstream>
#define dim 100005
using namespace std;
ifstream f ("hotel.in");
ofstream g ("hotel.out");
int arb_max[4*dim + 50],arb_st[4*dim + 50],arb_dr[4*dim + 50]; int x,a,b,m,n,i,ultim,s,Max,caz;
inline void update(int st,int dr,int a,int b,int nod,int val)
{
int mij = (st + dr) / 2;
if(b < st || a > dr)
return;
if(a <= st && dr <= b)
{
arb_max[nod] = arb_st[nod] = arb_dr[nod] = val*(dr - st + 1);
return;
}
if(arb_max[nod] == 0)
arb_dr[2*nod] = arb_dr[2*nod + 1] = arb_st[2*nod] = arb_st[2*nod + 1] = arb_max[2*nod] = arb_max[2*nod + 1] = 0;
if(arb_max[nod] == dr - st + 1)
{
arb_dr[2*nod] = arb_st[2*nod] = arb_max[2*nod] = mij - st + 1;
arb_dr[2*nod + 1] = arb_st[2*nod + 1] = arb_max[2*nod + 1] = dr - mij;
}
update(st,mij,a,b,2*nod,val);
update(mij + 1,dr,a,b,2*nod + 1,val);
arb_st[nod] = arb_st[2*nod];
if(arb_st[2*nod] == mij - st + 1)
arb_st[nod] += arb_st[2*nod + 1];
arb_dr[nod] = arb_dr[2*nod + 1];
if(arb_dr[nod] == dr - mij)
arb_dr[nod] += arb_dr[2*nod];
arb_max[nod] = max(arb_max[2*nod] , max(arb_max[2*nod + 1] , arb_st[2*nod + 1] + arb_dr[2*nod]));
}
int main()
{
f >> n >> m;
update(1,n,1,n,1,1);
for(i = 1;i <= m;i++)
{
f >> caz;
switch(caz)
{
case 1:
f >> a >> b;
b = a + b - 1;
update(1,n,a,b,1,0);
break;
case 2:
f >> a >> b;
b = a + b - 1;
update(1,n,a,b,1,1);
break;
case 3:
g << arb_max[1] << '\n';
break;
}
}
return 0;
}