#include <iostream>
#include <fstream>
#define nl '\n'
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
const int NMAX = 1e5+5;
int n;
struct node
{
int maxSecv;
int maxPref;
int maxSuf;
int ocupate;
int lazy;
int sz;
};
node aint[4*NMAX];
void build(int node, int low, int high)
{
if (low == high)
{
aint[node] = {1, 1, 1, 0, -1, 1};
return;
}
int mid = (low+high)>>1;
build(2*node, low, mid);
build(2*node+1, mid+1, high);
aint[node] = {high-low+1, high-low+1, high-low+1, 0, -1, high-low+1};
return;
}
void propagate(int node)
{
if (aint[node].lazy != -1)
{
if (aint[node].lazy == 0)
{
aint[2*node] = {aint[2*node].sz, aint[2*node].sz, aint[2*node].sz, 0, 0, aint[2*node].sz};
aint[2*node+1] = {aint[2*node+1].sz, aint[2*node+1].sz, aint[2*node+1].sz, 0, 0, aint[2*node+1].sz};
}
else
{
aint[2*node] = {0, 0, 0, aint[2*node].sz, 1, aint[2*node].sz};
aint[2*node+1] = {0, 0, 0, aint[2*node+1].sz, 1, aint[2*node+1].sz};
}
aint[node].lazy = -1;
}
return;
}
void update(int node, int low, int high, int a, int b, int val)
{
if (a <= low && high <= b)
{
if (val == 0) /// 0 pleaca
aint[node] = {aint[node].sz, aint[node].sz, aint[node].sz, 0, 0, aint[node].sz};
else
aint[node] = {0, 0, 0, aint[node].sz, 1, aint[node].sz};
return;
}
int mid = (low+high)>>1;
propagate(node);
if (a <= mid)
update(2*node, low, mid, a, b, val);
if (mid+1 <= b)
update(2*node+1, mid+1, high, a, b, val);
aint[node].ocupate = aint[2*node].ocupate+aint[2*node+1].ocupate;
aint[node].maxSecv = max(aint[2*node].maxSecv, aint[2*node+1].maxSecv);
aint[node].maxSecv = max(aint[node].maxSecv, aint[2*node].maxSuf+aint[2*node+1].maxPref);
aint[node].maxPref = aint[2*node].maxPref;
if (aint[2*node].ocupate == 0)
aint[node].maxPref += aint[2*node+1].maxPref;
aint[node].maxSuf = aint[2*node+1].maxSuf;
if (aint[2*node+1].ocupate == 0)
aint[node].maxSuf += aint[2*node].maxSuf;
return;
}
int main()
{
int t;
fin >> n >> t;
build(1, 1, n);
while (t--)
{
int c, x, y;
fin >> c;
if (c == 3)
fout << aint[1].maxSecv << nl;
if (c == 2)
{
fin >> x >> y;
y = x+y-1;
update(1, 1, n, x, y, 0);
}
if (c == 1)
{
fin >> x >> y;
y = x+y-1;
update(1, 1, n, x, y, 1);
}
}
return 0;
}