#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
const int nmax = 1e5;
struct nod
{
int left, longest, right;
};
struct COPAC
{
int n;
int lazy[4 * nmax];
nod v[4 * nmax];
void init(int n)
{
this->n = 1 << (32 - __builtin_clz(n));
for(int i = 1; i < 2 * n; i++)
lazy[i] = -1;
}
void push(int node, int len)
{
if(lazy[node] != -1) {
int group = len * lazy[node];
v[node] = {group, group, group};
if(node < n)
lazy[2 * node] = lazy[2 * node + 1] = lazy[node];
lazy[node] = -1;
}
}
void pull(int node, int len)
{
if(v[2 * node].left == len / 2)
v[node].left = len / 2 + v[2 * node + 1].left;
else
v[node].left = v[2 * node].left;
if(v[2 * node + 1].right == len / 2)
v[node].right = len / 2 + v[2 * node].right;
else
v[node].right = v[2 * node + 1].right;
v[node].longest = max({v[2 * node].longest, v[2 * node + 1].longest, v[2 * node].left, v[2 * node + 1].right, v[2 * node].right + v[2 * node + 1].left});
}
void updateHelp(int node, int l, int r, int pl, int pr, int val) ///[0, n)
{
push(node, pr - pl);
if(l >= r)
return;
if(pl == l && pr == r) {
lazy[node] = val;
push(node, pr - pl);
return;
}
int mid = (pl + pr) >> 1;
updateHelp(2 * node, l, min(r, mid), pl, mid, val);
updateHelp(2 * node + 1, max(l, mid), r, mid, pr, val);
pull(node, pr - pl);
}
int query() ///longest sequence of 1
{
push(1, n / 2);
return v[1].longest;
}
void update(int l, int len, int val) ///from [1, n] go to [0, n)
{
updateHelp(1, l - 1, l + len - 1, 0, n, val);
}
}aint;
int main()
{
int n, q;
fin >> n >> q;
aint.init(n);
aint.update(1, n, 1);
while(q--) {
int c;
fin >> c;
if(c == 3)
fout << aint.query() << '\n';
else {
int l, m;
fin >> l >> m;
aint.update(l, m, c - 1); ///switch 1 and 0
}
}
return 0;
}