#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); i++)
typedef long long ll;
#define pb push_back
#define st first
#define nd second
const int MAXN = 1 << 19;
struct pt {
    ll l, r;
    ll czas;
    ll travel;
};
pt polacz(pt a, pt b) {
    pt w;
    b.l -= a.czas;
    b.r -= a.czas;
    if (b.r < a.l) {
        w.travel = a.l - b.r;
        w.czas = a.czas + b.czas - w.travel;
        w.travel += a.travel + b.travel;
        w.l = a.l;
        w.r = a.l;
        return w;
    }
    w.l = min(a.r, max(a.l, b.l));
    w.r = max(a.l, min(a.r, b.r));
    w.czas = a.czas + b.czas + max(0ll, b.l - w.r);
    w.travel = a.travel + b.travel;
    return w;
}
pt seg[2 * MAXN];
pt seg2[2 * MAXN];
void upd(int v, pt x) {
    v += MAXN;
    seg[v] = x;
    v /= 2;
    while (v > 0) {
        seg[v] = polacz(seg[2 * v], seg[2 * v + 1]);
        v /= 2;
    }
}
void upd2(int v, pt x) {
    v += MAXN;
    seg2[v] = x;
    v /= 2;
    while (v > 0) {
        seg2[v] = polacz(seg2[2 * v + 1], seg2[2 * v]);
        v /= 2;
    }
}
pt query(int l, int r) {
    vector<pt> vec1;
    vector<pt> vec2;
    l += MAXN;
    r += MAXN;
    while (l < r) {
        if (l % 2 == 1) {
            vec1.pb(seg[l]);
            l++;
        }
        if (r % 2 == 0) {
            vec2.pb(seg[r]);
            r--;
        }
        l /= 2;
        r /= 2;
    }
    if (l == r) {
        vec1.pb(seg[l]);
    }
    vector<pt> vec;
    int sz1 = vec1.size();
    int sz2 = vec2.size();
    reverse(vec2.begin(), vec2.end());
    rep(i, sz1) {
        vec.pb(vec1[i]);
    }
    rep(i, sz2) {
        vec.pb(vec2[i]);
    }
    pt w = vec[0];
    int sz = vec.size();
    for (int i = 1; i < sz; i++) {
        w = polacz(w, vec[i]);
    }
    return w;
}
pt query2(int l, int r) {
    vector<pt> vec1;
    vector<pt> vec2;
    l += MAXN;
    r += MAXN;
    while (l < r) {
        if (l % 2 == 1) {
            vec1.pb(seg2[l]);
            l++;
        }
        if (r % 2 == 0) {
            vec2.pb(seg2[r]);
            r--;
        }
        l /= 2;
        r /= 2;
    }
    if (l == r) {
        vec1.pb(seg2[l]);
    }
    vector<pt> vec;
    int sz1 = vec1.size();
    int sz2 = vec2.size();
    reverse(vec1.begin(), vec1.end());
    rep(i, sz2) {
        vec.pb(vec2[i]);
    }
    rep(i, sz1) {
        vec.pb(vec1[i]);
    }
    pt w = vec[0];
    int sz = vec.size();
    for (int i = 1; i < sz; i++) {
        w = polacz(w, vec[i]);
    }
    return w;
}
int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n, q;
    cin >> n >> q;
    pt T[n - 1];
    rep(i, n - 1) {
        cin >> T[i].l >> T[i].r;
        T[i].r--;
        T[i].czas = 1ll;
        T[i].travel = 0ll;
        upd(i, T[i]);
        upd2(i, T[i]);
    }
    while (q--) {
        int t;
        cin >> t;
        if (t == 2) {
            int a, c; ll b, d;
            cin >> a >> b >> c >> d;
            a--;
            c--;
            if (a < c) {
                pt w = query(a, c - 1);
                w = polacz({b, b, 0, 0}, w);
                ll ans = w.travel + max(0ll, w.czas + w.l - d);
                cout << ans << '\n';
            }
            else if (a > c) {
                pt w = query2(c, a - 1);
                w = polacz({b, b, 0, 0}, w);
                ll ans = w.travel + max(0ll, w.czas + w.l - d);
                cout << ans << '\n';
            }
            else {
                ll ans = max(0ll, b - d);
                cout << ans << '\n';
            }
        }
        else {
            int p; ll l, r;
            cin >> p >> l >> r;
            p--;
            T[p].l = l;
            T[p].r = r - 1;
            T[p].czas = 1;
            T[p].travel = 0;
            upd(p, T[p]);
            upd2(p, T[p]);
        }
    }
	return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |