#include using namespace std; using i32 = int; using i64 = long long; using i128 = __int128_t; using f64 = double; using p2 = pair; using p3 = tuple; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(18); _main(); } template struct segtree { i32 n, log; vector node; explicit segtree(i32 n) : n(n), log(0), node(2 * n, e()) { while (n >> log) log++; log--; } void update(i32 i) { node[i] = op(node[i << 1], node[i << 1 | 1]); } void set(i32 i, S x) { i += n; node[i] = x; for (i32 k = 1; k <= log; k++) update(i >> k); } S get(i32 i) { return node[i + n]; } S prod(i32 l, i32 r) { l += n, r += n; S ls = e(), rs = e(); while (l < r) { if (l & 1) ls = op(ls, node[l++]); if (r & 1) rs = op(node[--r], rs); l >>= 1, r >>= 1; } return op(ls, rs); } }; p2 op(p2 a, p2 b) {return {min(a.first, b.first + a.second), a.second + b.second};} p2 e() {return {1e18, 0};} void _main() { i64 q, m; cin >> q >> m; m++; segtree seg(m); for (i32 i = 0; i < m; i++) seg.set(i, {0, 0}); for (;q--;) { i64 op, l, r, c; cin >> op >> l >> r >> c; if (op == 2) c = -c; seg.set(l, {seg.get(l).second + c, seg.get(l).second + c}); seg.set(r, {seg.get(r).second - c, seg.get(r).second - c}); i64 mn = seg.prod(0, m - 1).first; cout << mn << "\n"; } }