#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 Query(int pos, int st, int dr)
{
int mij = (st + dr) / 2;
if (st >= x && dr <= y)
{
if(st==x) ans=A[pos];
else
{
a=(ans.x==ans.y && ans.x==ans.s);
b=(A[pos].x==A[pos].y && A[pos].x==A[pos].s && A[pos].s==(dr-st+1));
if(a && b) ans.s+=A[pos].s, ans.x=ans.s, ans.y=ans.s;
else
if(!a && b) ans.y+=A[pos].x, ans.s=max(ans.s,ans.y);
else
if(a && !b) ans.x+=A[pos].x, ans.y=A[pos].y, ans.s=max(ans.x,ans.y);
else ans.s=max(ans.s,ans.y+A[pos].x), ans.y=A[pos].y;
}
}
else
{
if (x <= mij && st != dr)
Query(2 * pos, st, mij);
if (y >= mij + 1 && st != dr)
Query(2 * pos + 1, mij + 1, dr);
}
}
void Update(int pos, int st, int dr)
{
int mij = (st + dr) / 2;
if (st == dr)
{
A[pos].s=q, A[pos].x=q, A[pos].y=q;
return;
}
if (x <= mij)
Update(2 * pos, st, mij);
else
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;
q=1;
for(int i=1; i<=n; i++) x=i, Update(1,1,n);
for (int i = 1; i <= m; i++)
{
fi >> op;
if(op == 1)
{
fi >> x >> y;
y+=x, q=0;
for(; x<y; x++)
Update(1,1,n);
}
else
if(op == 2)
{
fi >> x >> y;
y+=x, q=1;
for(; x<y; x++)
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;
}