#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, n) for (int i = 0; i < (n); i++)
#define st first
#define nd second
#define pb push_back
const ll INF = 1e18;
const int MAXN = 1 << 19;
struct wi {
    ll fi;
    ll kiedy;
    ll mus;
    ll zapas;
    ll rozm;
};
wi dp[2 * MAXN][2];
wi wyznacz(wi a, wi b) {
    wi w;
    w.rozm = a.rozm + b.rozm;
    w.fi = a.fi;
    w.mus = a.mus;
    ll mom = a.kiedy;
    if (a.kiedy <= b.fi) {
        w.kiedy = b.kiedy;
        w.mus += b.mus;
        w.zapas = min(a.zapas, b.zapas + max(0ll, b.fi - a.kiedy));
        return w;
    }
    ll r = a.kiedy - b.fi;
    if (r <= b.zapas) {
        w.kiedy = b.kiedy + r;
        w.zapas = min(a.zapas, b.zapas - r);
        return w;
    }
    // cout << "TO = " << b.rozm << '\n';
    ll roz = r - b.zapas;
    w.mus += roz;
    w.mus += b.mus;
    w.kiedy = max(b.kiedy, b.fi + b.zapas + b.rozm - b.mus);
    w.zapas = 0ll;
    return w;
}
void upd0(int v, wi x) {
    v += MAXN;
    dp[v][0] = x;
    v /= 2;
    while (v > 0) {
        dp[v][0] = wyznacz(dp[2 * v][0], dp[2 * v + 1][0]);
        v /= 2;
    }
}
void upd1(int v, wi x) {
    v += MAXN;
    dp[v][1] = x;
    v /= 2;
    while (v > 0) {
        dp[v][1] = wyznacz(dp[2 * v + 1][1], dp[2 * v][1]);
        v /= 2;
    }
}
vector<wi> query0(int l, int r) {
    vector<wi> v1;
    vector<wi> v2;
    l += MAXN;
    r += MAXN;
    while (l < r) {
        if (l % 2 == 1) {
            v1.pb(dp[l][0]);
            l++;
        }
        if (r % 2 == 0) {
            v2.pb(dp[r][0]);
            r--;
        }
        l /= 2;
        r /= 2;
    }
    if (l == r) {
        v1.pb(dp[l][0]);
    }
    vector<wi> v;
    int sz1 = v1.size();
    int sz2 = v2.size();
    rep(i, sz1) {
        v.pb(v1[i]);
    }
    for (int i = sz2 - 1; i >= 0; i--) {
        v.pb(v2[i]);
    }
    return v;
}
vector<wi> query1(int l, int r) {
    vector<wi> v1;
    vector<wi> v2;
    l += MAXN;
    r += MAXN;
    while (l < r) {
        if (l % 2 == 1) {
            v1.pb(dp[l][1]);
            l++;
        }
        if (r % 2 == 0) {
            v2.pb(dp[r][1]);
            r--;
        }
        l /= 2;
        r /= 2;
    }
    if (l == r) {
        v1.pb(dp[l][1]);
    }
    vector<wi> v;
    int sz1 = v1.size();
    int sz2 = v2.size();
    rep(i, sz2) {
        v.pb(v2[i]);
    }
    for (int i = sz1 - 1; i >= 0; i--) {
        v.pb(v1[i]);
    }
    return v;
}
int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n, q;
    cin >> n >> q;
    pair<ll, ll> pom[n];
    wi T[n];
    rep(i, n - 1) {
        cin >> pom[i].st >> pom[i].nd;
        T[i].fi = pom[i].st;
        T[i].kiedy = pom[i].st + 1;
        T[i].zapas = pom[i].nd - pom[i].st - 1;
        T[i].mus = 0ll;
        T[i].rozm = 1ll;
        upd0(i, T[i]);
        upd1(i, T[i]);
    }
    wi A;
    rep(cos, q) {
        int t;
        cin >> t;
        if (t == 1) {
            int p; ll s, e;
            cin >> p >> s >> e;
            p--;
            T[p].fi = s;
            T[p].kiedy = s + 1;
            T[p].zapas = e - s - 1;
            T[p].mus = 0ll;
            T[p].rozm = 1ll;
            upd0(p, T[p]);
            upd1(p, T[p]);
        }
        else {
            int a, c;
            ll b, d;
            cin >> a >> b >> c >> d;
            a--;
            c--;
            wi X;
            X.fi = b;
            X.kiedy = b;
            X.mus = 0ll;
            X.zapas = INF;
            X.rozm = 0ll;
            if (a <= c) {
                c--;
                if (a <= c) {
                    vector<wi> vec = query0(a, c);
                    int sz = vec.size();
                    rep(i, sz) {
                        // cout << vec[i].fi << " " << vec[i].kiedy << " " << vec[i].mus << " " << vec[i].zapas << '\n';
                        X = wyznacz(X, vec[i]);
                        // cout << X.fi << " " << X.kiedy << " " << X.mus << " " << X.zapas << '\n';
                    }
                }
            }
            else {
                a--;
                if (a >= c) {
                    vector<wi> vec = query1(c, a);
                    int sz = vec.size();
                    rep(i, sz) {
                        X = wyznacz(X, vec[i]);
                    }
                }
            }
            // while (a > c) {
            //     wi droga = T[a - 1];
            //     X = wyznacz(X, droga);
            //     a--;
            // }
            // while (a < c) {
            //     wi droga = T[a];
            //     X = wyznacz(X, droga);
            //     a++;
            // }
            ll ans = max(0ll, X.kiedy - d);
            ans += X.mus;
            cout << ans << '\n';
        }
    }
    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... |