#include <bits/stdc++.h>
#define N 100005
using namespace std;
ifstream fi ("hotel.in");
ofstream fo ("hotel.out");
int n, m, op, x, y, q;
bool a,b,c;
struct
nume
{
int x,y,s;
} A[3 * N], ans;
void Build(int pos, int st, int dr)
{
int mij = (st + dr) / 2;
if (st == dr)
{
A[pos].s=1, A[pos].x=1, A[pos].y=1;
return;
}
Build(2 * pos, st, mij);
Build(2 * pos + 1, mij + 1, dr);
A[pos].s=A[pos].x=A[pos].y=A[pos*2].s+A[pos*2+1].s;
}
void Update(int pos, int st, int dr)
{
int mij = (st + dr) / 2;
if (st == dr)
{
if (st>=x && dr<=y) A[pos].s=q, A[pos].x=q, A[pos].y=q;
return;
}
Update(2 * pos, st, mij);
Update(2 * pos + 1, mij + 1, dr);
a=(A[pos*2].x==A[pos*2].y && A[pos*2].x==A[pos*2].s && A[pos*2].s==((dr+st)/2-st+1));
b=(A[pos*2+1].x==A[pos*2+1].y && A[pos*2+1].x==A[pos*2+1].s && A[pos*2+1].s==(dr-(dr+st)/2));
if(a && b) A[pos].s=A[pos*2].s+A[pos*2+1].s, A[pos].x=A[pos].s, A[pos].y=A[pos].s;
else
if(a & !b) A[pos].x=A[pos*2].s+A[pos*2+1].x, A[pos].s=max(A[pos*2].s,A[pos*2].y+A[pos*2+1].x), A[pos].y=A[pos*2+1].y;
else
if(!a & b) A[pos].y=A[pos*2].y+A[pos*2+1].s, A[pos].s=max(A[pos*2].y+A[pos*2+1].x,A[pos*2+1].s), A[pos].x=A[pos*2].x;
else
A[pos].s=max(max(A[pos*2].s,A[pos*2+1].s),A[pos*2].y+A[pos*2+1].x),A[pos].x=A[pos*2].x,A[pos].y=A[pos*2+1].y;
}
int main()
{
fi >> n >> m;
Build(1,1,n);
for (int i = 1; i <= m; i++)
{
fi >> op;
if(op == 1)
{
fi >> x >> y;
y+=x-1, q=0;
Update(1,1,n);
}
else
if(op == 2)
{
fi >> x >> y;
y+=x-1, q=1;
Update(1,1,n);
}
else
if (op == 3) fo << A[1].s << '\n';
/*ans.s=0;ans.x=0;ans.y=0;
Query(1, 1, n);
fo << ans.s<< "\n";*/
//for(int i=1; i<=n*3; i++) fo << "\n A[" << i << "]" << " s=" << A[i].s << " x=" << A[i].x << " y=" << A[i].y; fo << '\n';
}
return 0;
}