#include <bits/stdc++.h>
using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");
const int NMAX = 100005;
struct AINT {
int rmax, lmax; // subsecventa continua maxima care porneste din dreapta si stanga intervalului
int maxlen; //subsecventa continua maxima
}aint[4 * NMAX];
void computenode(int node, int le, int ri) {
int mid = (le + ri) / 2;
aint[node].maxlen = max(aint[node * 2].rmax + aint[node * 2 + 1].lmax, max(aint[node * 2].maxlen, aint[node * 2 + 1].maxlen));
aint[node].lmax = aint[node * 2].lmax;
if(aint[node * 2].lmax == (mid - le + 1))
aint[node].lmax += aint[node * 2 + 1].lmax;
aint[node].rmax = aint[node * 2 + 1].rmax;
if(aint[node * 2 + 1].rmax == (ri - mid))
aint[node].rmax += aint[node * 2].rmax;
}
void update(int from, int to, bool state, int node, int le, int ri, int oldle, int oldri) {
if(from <= le && ri <= to) {
if(state == 1)
aint[node].maxlen = aint[node].lmax = aint[node].rmax = 0;
else
aint[node].maxlen = aint[node].lmax = aint[node].rmax = (ri - le + 1);
} else {
int mid = (le + ri) / 2;
if(aint[node].maxlen == 0)
aint[node * 2].maxlen = aint[node * 2].rmax = aint[node * 2].lmax = aint[node * 2 + 1].maxlen = aint[node * 2 + 1].rmax = aint[node * 2 + 1].lmax = 0;
if(aint[node].maxlen == (ri - le + 1)) {
aint[node * 2].maxlen = aint[node * 2].rmax = aint[node * 2].lmax = mid - le + 1;
aint[node * 2 + 1].maxlen = aint[node * 2 + 1].rmax = aint[node * 2 + 1].lmax = ri - mid;
}
if(from <= mid)
update(from, to, state, node * 2, le, mid, le, ri);
if(mid < to)
update(from, to, state, node * 2 + 1, mid + 1, ri, le, ri);
computenode(node, le, ri);
}
}
void buildtree(int node, int le, int ri) {
aint[node].rmax = aint[node].lmax = aint[node].maxlen = (ri - le + 1);
if(le == ri)
return;
int mid = (le + ri) /2;
buildtree(node * 2, le, mid);
buildtree(node * 2 + 1, mid + 1, ri);
}
int main() {
int n, p;
in >> n >> p;
buildtree(1, 1, n);
aint[0].maxlen = -1;
for(int i = 1; i <= p; i ++) {
int c, start, m;
in >> c;
if(c == 1) {
in >> start >> m;
update(start, start + m - 1, 1, 1, 1, n, 1, n);
}
if(c == 2) {
in >> start >> m;
update(start, start + m - 1, 0, 1, 1, n, 1, n);
}
if(c == 3)
out << aint[1].maxlen << "\n";
}
return 0;
}