#include <fstream>
using namespace std;
const int Nmax = 100005;
struct node{
int max_len;
int sufix;
int prefix;
};
int n;
node aint[4 * Nmax];
void build(int nod, int st, int dr){
if(st == dr){
aint[nod].max_len = 1;
aint[nod].sufix = 1;
aint[nod].prefix = 1;
return;
}
int mid;
mid = (st + dr) / 2;
build(2 * nod, st, mid);
build(2 * nod + 1, mid + 1, dr);
aint[nod].max_len = aint[2 * nod].max_len + aint[2 * nod + 1].max_len;
aint[nod].sufix = aint[2 * nod].sufix + aint[2 * nod + 1].sufix;
aint[nod].prefix = aint[2 * nod].prefix + aint[2 * nod + 1].prefix;
}
void update1(int nod, int st, int dr, int a, int b){
if(st == dr && st == a && dr == b){
aint[nod].max_len = 0;
aint[nod].sufix = 0;
aint[nod].prefix = 0;
return;
}
int mid;
mid = (st + dr) / 2;
if(b <= mid){
update1(2 * nod, st, mid, a, b);
}
else if(mid < a){
update1(2 * nod + 1, mid + 1, dr, a, b);
}
else{
update1(2 * nod, st, mid, a, mid);
update1(2 * nod + 1, mid + 1, dr, mid + 1, b);
}
aint[nod].max_len = max(aint[2 * nod].max_len, aint[2 * nod + 1].max_len);
aint[nod].max_len = max(aint[nod].max_len, aint[2 * nod].sufix + aint[2 * nod + 1].prefix);
if(aint[2 * nod].prefix == mid - st + 1){
aint[nod].prefix = aint[2 * nod].prefix + aint[2 * nod + 1].prefix;
}
else{
aint[nod].prefix = aint[2 * nod].prefix;
}
if(aint[2 * nod + 1].sufix == dr - mid){
aint[nod].sufix = aint[2 * nod + 1].sufix + aint[2 * nod].sufix;
}
else{
aint[nod].sufix = aint[2 * nod + 1].sufix;
}
}
void update2(int nod, int st, int dr, int a, int b){
if(st == dr && st == a && dr == b){
aint[nod].max_len = dr - st + 1;
aint[nod].sufix = dr - st + 1;
aint[nod].prefix = dr - st + 1;
return;
}
int mid;
mid = (st + dr) / 2;
if(b <= mid){
update2(2 * nod, st, mid, a, b);
}
else if(mid < a){
update2(2 * nod + 1, mid + 1, dr, a, b);
}
else{
update2(2 * nod, st, mid, a, mid);
update2(2 * nod + 1, mid + 1, dr, mid + 1, b);
}
aint[nod].max_len = max(aint[2 * nod].max_len, aint[2 * nod + 1].max_len);
aint[nod].max_len = max(aint[nod].max_len, aint[2 * nod].sufix + aint[2 * nod + 1].prefix);
if(aint[2 * nod].prefix == mid - st + 1){
aint[nod].prefix = aint[2 * nod].prefix + aint[2 * nod + 1].prefix;
}
else{
aint[nod].prefix = aint[2 * nod].prefix;
}
if(aint[2 * nod + 1].sufix == dr - mid){
aint[nod].sufix = aint[2 * nod + 1].sufix + aint[2 * nod].sufix;
}
else{
aint[nod].sufix = aint[2 * nod + 1].sufix;
}
}
int main(){
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int p, a, b, op;
fin >> n >> p;
build(1, 1, n);
while(p--){
fin >> op;
if(op == 3){
fout << aint[1].max_len << '\n';
}
else if(op == 1){
fin >> a >> b;
update1(1, 1, n, a, a + b - 1);
}
else{
fin >> a >> b;
update2(1, 1, n, a, a + b - 1);
}
}
return 0;
}