#include <fstream>
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
const int MaxN = 100002;
class Aint{
public:
void Solve(){
int n;
f >> n;
Start(1, 1, n);
int p;
f >> p;
for(int t; p; --p){
f >> t;
if(t == 1){
int a, b;
f >> a >> b;
Range_Fill(1, 1, n, a, a+b-1);
}
else if(t == 2){
int a, b;
f >> a >> b;
Range_Empty(1, 1, n, a, a+b-1);
}
else{
int ans = max(l[1], r[1]);
ans = max(ans, mid[1]);
g << ans << '\n';
}
}
}
private:
int r[MaxN<<2], mid[MaxN<<2], l[MaxN<<2];
bool Lazy[MaxN<<2];
void Start(int node, int st, int dr){
Lazy[node] = 0;
l[node] = r[node] = mid[node] = dr-st+1;
if(st == dr) return;
int mij = st+dr>>1;
Start(node<<1, st, mij);
Start(node<<1|1, mij+1, dr);
}
void Range_Fill(int node, int st, int dr, int a, int b){
if(st >= a && dr <= b){
l[node] = r[node] = mid[node] = 0;
Lazy[node<<1] = Lazy[node<<1|1] = 1;
Lazy[node] = 0;
return;
}
int mij = st+dr>>1;
if(mij >= a) Range_Fill(node<<1, st, mij, a, b);
if(mij < b) Range_Fill(node<<1|1, mij+1, dr, a, b);
if(l[node<<1] == mij-st+1){
l[node] = l[node<<1] + l[node<<1|1];
}
else l[node] = l[node<<1];
if(r[node<<1|1] == dr-mij){
r[node] = r[node<<1] + r[node<<1|1];
}
else r[node] = r[node<<1|1];
mid[node] = max(mid[node<<1|1], mid[node<<1]);
mid[node] = max(mid[node], r[node<<1] + l[node<<1|1]);
}
void Range_Empty(int node, int st, int dr, int a, int b){
if(st >= a && dr <= b){
l[node] = r[node] = mid[node] = dr-st+1;
Lazy[node] = 0;
return;
}
int mij = st+dr>>1;
if(Lazy[node]) Range_Fill(node, st, dr, st, dr);
if(mij >= a) Range_Empty(node<<1, st, mij, a, b);
else if(Lazy[node<<1]) Range_Fill(node<<1, st, mij, st, mij);
if(mij < b) Range_Empty(node<<1|1, mij+1, dr, a, b);
else if(Lazy[node<<1|1]) Range_Fill(node<<1|1, mij+1, dr, mij+1, dr);
if(l[node<<1] == mij-st+1){
l[node] = l[node<<1] + l[node<<1|1];
}
else l[node] = l[node<<1];
if(r[node<<1|1] == dr-mij){
r[node] = r[node<<1] + r[node<<1|1];
}
else r[node] = r[node<<1|1];
mid[node] = max(mid[node<<1|1], mid[node<<1]);
mid[node] = max(mid[node], r[node<<1] + l[node<<1|1]);
}
}Arbore;
int main()
{
Arbore.Solve();
return 0;
}