#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
std::ifstream fin("hotel.in");
std::ofstream fout("hotel.out");
struct SegTreeNode {
int64_t sum = 0;
int64_t pfx_sum = 0;
int64_t sfx_sum = 0;
int64_t max_sum = 0;
};
int x, q;
SegTreeNode tree[400005];
int64_t lazy[400005];
void init_tree(int node, int l, int r) {
if (l==r) {
tree[node].sum = tree[node].pfx_sum = tree[node].sfx_sum = tree[node].max_sum = 1;
return;
}
int m = (l+r)>>1;
init_tree(node<<1,l,m);
init_tree(node<<1|1,m+1,r);
tree[node].sum = tree[node<<1].sum + tree[node<<1|1].sum;
tree[node].pfx_sum = std::max(tree[node<<1].pfx_sum,tree[node<<1].sum+tree[node<<1|1].pfx_sum);
tree[node].sfx_sum = std::max(tree[node<<1|1].sfx_sum,tree[node<<1|1].sum+tree[node<<1].sfx_sum);
tree[node].max_sum = std::max(tree[node].pfx_sum,
std::max(tree[node].sfx_sum,
std::max(tree[node<<1].max_sum,
std::max(tree[node<<1|1].max_sum,
tree[node<<1].sfx_sum+tree[node<<1|1].pfx_sum))));
}
void push(int node, int l, int r) {
if (!lazy[node]) return;
tree[node].sum = 1LL*(r-l+1)*lazy[node];
tree[node].pfx_sum = 1LL*(r-l+1)*lazy[node];
tree[node].sfx_sum = 1LL*(r-l+1)*lazy[node];
tree[node].max_sum = 1LL*(r-l+1)*lazy[node];
if (l!=r) {
int m = (l+r)>>1;
tree[node<<1].sum = 1LL*(m-l+1)*lazy[node];
tree[node<<1].pfx_sum = 1LL*(m-l+1)*lazy[node];
tree[node<<1].sfx_sum = 1LL*(m-l+1)*lazy[node];
tree[node<<1].max_sum = 1LL*(m-l+1)*lazy[node];
tree[node<<1|1].sum = 1LL*(r-m)*lazy[node];
tree[node<<1|1].pfx_sum = 1LL*(r-m)*lazy[node];
tree[node<<1|1].sfx_sum = 1LL*(r-m)*lazy[node];
tree[node<<1|1].max_sum = 1LL*(r-m)*lazy[node];
lazy[node<<1] = lazy[node];
lazy[node<<1|1] = lazy[node];
}
lazy[node] = 0;
}
void update(int node, int l, int r, int st, int fi, int val) {
push(node,l,r);
if (l>fi||r<st) return;
if (st<=l&&r<=fi) {
lazy[node] += val;
push(node,l,r);
return;
}
int m = (l+r)>>1;
update(node<<1,l,m,st,fi,val);
update(node<<1|1,m+1,r,st,fi,val);
tree[node].sum = tree[node<<1].sum + tree[node<<1|1].sum;
tree[node].pfx_sum = std::max(tree[node<<1].pfx_sum,tree[node<<1].sum+tree[node<<1|1].pfx_sum);
tree[node].sfx_sum = std::max(tree[node<<1|1].sfx_sum,tree[node<<1|1].sum+tree[node<<1].sfx_sum);
tree[node].max_sum = std::max(tree[node].pfx_sum,
std::max(tree[node].sfx_sum,
std::max(tree[node<<1].max_sum,
std::max(tree[node<<1|1].max_sum,
tree[node<<1].sfx_sum+tree[node<<1|1].pfx_sum))));
}
SegTreeNode query(int node, int l, int r, int st, int fi) {
SegTreeNode ret = {-0x5f3f3f3f3f3f3f3f,-0x5f3f3f3f3f3f3f3f,-0x5f3f3f3f3f3f3f3f,-0x5f3f3f3f3f3f3f3f};
push(node,l,r);
if (l>fi||r<st) return ret;
if (st<=l&&r<=fi) {
return tree[node];
}
int m = (l+r)>>1;
SegTreeNode left = query(node<<1,l,m,st,fi);
SegTreeNode right = query(node<<1|1,m+1,r,st,fi);
ret.sum = left.sum + right.sum;
ret.pfx_sum = std::max(left.pfx_sum,left.sum+right.pfx_sum);
ret.sfx_sum = std::max(right.sfx_sum,right.sum+left.sfx_sum);
ret.max_sum = std::max(ret.pfx_sum,
std::max(ret.sfx_sum,
std::max(left.max_sum,
std::max(right.max_sum,
left.sfx_sum+right.pfx_sum))));
return ret;
}
int main() {
fin >> x >> q;
init_tree(1,1,x);
while (q--) {
int op, a, b;
fin >> op;
if (op<=2) fin >> a >> b;
if (op==1) {
update(1,1,x,a,a+b-1,-0x3f3f3f3f);
}
else if (op==2) {
update(1,1,x,a,a+b-1,1);
}
else {
SegTreeNode tmp = query(1,1,x,1,x);
fout << std::max(static_cast<int64_t>(0),tmp.max_sum) << "\n";
}
}
}