/*
#include <iostream>
#include <fstream>
#define NUM 100005
struct vertex
{
int state, ll, lr, lmax;
};
vertex tree[4 * NUM];
int n, p, c;
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
void build(int pos, int tl, int tr)
{
if(tl == tr)
{
tree[pos].ll = tree[pos].lr = tree[pos].lmax = 1;
return;
}
int tm = tl + ((tr - tl) >> 1);
build((pos << 1), tl, tm);
build((pos << 1) + 1, tm + 1, tr);
tree[pos].ll = tree[pos].lr = tree[pos].lmax = tr - tl + 1;
}
void update(int pos, int tl, int tr, int l, int r)
{
if(tree[pos].state == 1)
{
tree[pos].ll = tree[pos].lr = tree[pos].lmax = 0;
if(tl != tr)
tree[(pos << 1)].state = tree[(pos << 1) + 1].state = 1;
tree[pos].state = -1;
}
else if(tree[pos].state == 0)
{
tree[pos].ll = tree[pos].lr = tree[pos].lmax = tr - tl + 1;
if(tl != tr)
tree[(pos << 1)].state = tree[(pos << 1) + 1].state = 0;
tree[pos].state = -1;
}
if(tl > r || tr < l)
return;
if(l <= tl && tr <= r)
{
if(c == 1) //new tourists
{
tree[pos].ll = tree[pos].lr = tree[pos].lmax = 0;
if(tl != tr) {
tree[(pos << 1)].state = tree[(pos << 1) + 1].state = 1;
}
}
else {
tree[pos].ll = tree[pos].lr = tree[pos].lmax = tr - tl + 1;
if (tl != tr) {
tree[(pos << 1)].state = tree[(pos << 1) + 1].state = 0;
}
}
return;
}
int tm = tl + ((tr - tl) >> 1);
update((pos << 1), tl, tm, l, r);
update((pos << 1) + 1, tm + 1, tr, l, r);
tree[pos].lmax = max(tree[(pos << 1)].lmax, max(tree[(pos << 1) + 1].lmax, tree[(pos << 1)].lr + tree[(pos << 1) + 1].lr));
tree[pos].ll = (tree[(pos << 1)].lmax == tm - tl + 1) ?
tree[(pos << 1)].lmax + tree[(pos << 1) + 1].ll :
tree[(pos << 1)].ll;
tree[pos].lr = (tree[(pos << 1) + 1].lmax == tr - tm) ?
tree[(pos << 1) + 1].lmax + tree[(pos << 1)].lr :
tree[(pos << 1) + 1].lr;
}
int main()
{
fin >> n >> p;
build(1, 1, n);
for(int i = 0; i < p; ++i)
{
fin >> c;
if(c == 3)
fout << tree[1].lmax << '\n';
else
{
int l, nr;
fin >> l >> nr;
update(1, 1, n, l, l+nr-1);
}
}
fin.close();
fout.close();
}*/
#include <bits/stdc++.h>
#define NUM 100005
struct vertex
{
int state, ll, lr, lmax;
};
vertex tree[4 * NUM];
int n, p, c, S, D;
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
void build(int pos, int tl, int tr)
{
if(tl == tr)
{
tree[pos].ll = tree[pos].lr = tree[pos].lmax = 1;
return;
}
int tm = tl + ((tr - tl) >> 1);
build((pos << 1), tl, tm);
build((pos << 1) + 1, tm + 1, tr);
tree[pos].ll = tree[pos].lr = tree[pos].lmax = tr - tl + 1;
}
void update(int pos, int tl, int tr)
{
if(tree[pos].state == 1)
{
tree[pos].ll = tree[pos].lr = tree[pos].lmax = 0;
if(tl != tr)
tree[(pos << 1)].state = tree[(pos << 1) + 1].state = 1;
tree[pos].state = -1;
}
else if(tree[pos].state == 0)
{
tree[pos].ll = tree[pos].lr = tree[pos].lmax = tr - tl + 1;
if(tl != tr)
tree[(pos << 1)].state = tree[(pos << 1) + 1].state = 0;
tree[pos].state = -1;
}
if(tl > D || tr < S)
return;
if(S <= tl && tr <= D)
{
if(c == 1)
{
tree[pos].ll = tree[pos].lr = tree[pos].lmax = 0;
if(tl != tr)
tree[(pos << 1)].state = tree[(pos << 1) + 1].state = 1;
}
else
{
tree[pos].ll = tree[pos].lr = tree[pos].lmax = tr - tl + 1;
if(tl != tr)
tree[(pos << 1)].state = tree[(pos << 1) + 1].state = 0;
}
return;
}
int tm = tl + ((tr - tl) >> 1);
update((pos << 1), tl, tm);
update((pos << 1) + 1, tm + 1, tr);
tree[pos].lmax = max(tree[(pos << 1)].lmax, max(tree[(pos << 1) + 1].lmax, tree[(pos << 1)].lr + tree[(pos << 1) + 1].ll));
tree[pos].ll = (tree[(pos << 1)].lmax == tm - tl + 1) ? tree[(pos << 1)].lmax + tree[(pos << 1) + 1].ll : tree[(pos << 1)].ll;
tree[pos].lr = (tree[(pos << 1) + 1].lmax == tr - tm) ? tree[(pos << 1) + 1].lmax + tree[(pos << 1)].lr : tree[(pos << 1) + 1].lr;
}
int main()
{
f >> n >> p;
build(1, 1, n);
for(int i = 0; i < p; ++i)
{
f >> c;
if(c == 3)
g << tree[1].lmax << '\n';
else
{
f >> S >> D;
D = S + D - 1;
update(1, 1, n);
}
}
f.close();
g.close();
}