#include <fstream>
#define MAX 131072
#define leftSon (nod << 1)
#define rightSon ((nod << 1) + 1)
using namespace std;
struct ArboreIntervale
{
int left, right, best, use;
}aInt[4 * MAX];
int N, M, tip, a, b;
void Build(int nod, int l, int r)
{
aInt[nod].left = aInt[nod].right = aInt[nod].best = r - l + 1;
aInt[nod].use = -1;
if(l == r) return;
int m = (l + r) >> 1;
Build(leftSon, l, m);
Build(rightSon, m + 1, r);
}
void Update(int nod, int l, int r, int a, int b, int tip)
{
if(a <= l && r <= b)
{
aInt[nod].use = tip;
aInt[nod].left = aInt[nod].right = aInt[nod].best = tip * (r - l + 1);
return;
}
int m = (l + r) >> 1;
if(aInt[nod].use != -1)
{
Update(leftSon, l, m, l, m, aInt[nod].use);
Update(rightSon, m + 1, r, m + 1, r, aInt[nod].use);
aInt[nod].use = -1;
}
if(a <= m) Update(leftSon, l, m, a, b, tip);
if(b > m) Update(rightSon, m + 1, r, a, b, tip);
aInt[nod].best = max(max(aInt[leftSon].best, aInt[rightSon].best), aInt[leftSon].right + aInt[rightSon].left);
if(aInt[leftSon].left == m - l + 1) aInt[nod].left = aInt[leftSon].left + aInt[rightSon].left;
else aInt[nod].left = aInt[leftSon].left;
if(aInt[rightSon].right == r - m) aInt[nod].right = aInt[rightSon].right + aInt[leftSon].right;
else aInt[nod].right = aInt[rightSon].right;
}
int main()
{
ifstream in("hotel.in"); ofstream out("hotel.out");
in>>N>>M;
Build(1, 1, N);
for(int i = 1; i <= M; i++)
{
in>>tip;
if(tip == 3)
{
out<<aInt[1].best<<"\n";
continue;
}
in>>a>>b;
Update(1, 1, N, a, a + b - 1, 1 - tip % 2);
}
in.close(); out.close();
return 0;
}