#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
#define int long long
#define pii pair<int,int>
const int INF = 1e18;
int n;
int a[MAXN];
int b[MAXN];
int q;
int h[MAXN];
vector<pii> peal[MAXN];
vector<pii> query[MAXN];
int ans[MAXN];
struct Node
{
    int maxx;
    int minn;
    int res;
    Node()
    {
        maxx = -INF;
        minn = INF;
        res = -INF;
    }
};
Node st[4 * MAXN];
pii lazy[4 * MAXN];
Node Merge(Node A, Node B)
{
    Node cak;
    cak.maxx = max(A.maxx, B.maxx);
    cak.minn = min(A.minn, B.minn);
    cak.res = max(A.res, B.res);
    return cak;
}
void push(int id, int l, int r)
{
    if (lazy[id].first == -INF && lazy[id].second == INF) {
        return;
    }
    st[id].res = max({st[id].res, lazy[id].first - st[id].minn, st[id].maxx - lazy[id].second});
    if (l != r)
    {
        lazy[id * 2].first = max(lazy[id].first, lazy[id * 2].first);
        lazy[id * 2].second = min(lazy[id].second, lazy[id * 2].second);
        lazy[id * 2 + 1].first = max(lazy[id].first, lazy[id * 2 + 1].first);
        lazy[id * 2 + 1].second = min(lazy[id].second, lazy[id * 2 + 1].second);
    }
    lazy[id] = {-INF, INF};
}
void update(int id, int l, int r, int pos, int val1, int val2)
{
    push(id, l, r);
    if (l == r)
    {
        st[id].maxx = val1;
        st[id].minn = val2;
        st[id].res = -INF;
        return;
    }
    int m = (l + r) / 2;
    if (pos <= m)
    {
        update(id * 2, l, m, pos, val1, val2);
    }
    else
    {
        update(id * 2 + 1, m + 1, r, pos, val1, val2);
    }
    push(id*2, l, m);
    push(id*2+1, m+1, r);
    st[id] = Merge(st[id * 2], st[id * 2 + 1]);
}
void update_range(int id, int l, int r, int u, int v, int val)
{
    push(id, l, r);
    if (r < u || v < l)
    {
        return;
    }
    if (u <= l && r <= v)
    {
        lazy[id].first = max(lazy[id].first, val);
        lazy[id].second = min(lazy[id].second, val);
        st[id].res = max({st[id].res, lazy[id].first - st[id].minn, st[id].maxx - lazy[id].second});
        push(id, l, r);
        return;
    }
    int m = (l + r) / 2;
    update_range(id * 2, l, m, u, v, val);
    update_range(id * 2 + 1, m + 1, r, u, v, val);
    Node trai = st[id*2];
    trai.res = max({trai.res, lazy[id*2].first - trai.minn, trai.maxx - lazy[id*2].second});
    Node phai = st[id*2+1];
    phai.res = max({phai.res, lazy[id*2+1].first - phai.minn, phai.maxx - lazy[id*2+1].second});
    st[id] = Merge(trai, phai);
}
Node get(int id, int l, int r, int u, int v)
{
    push(id, l, r);
    if (v < l || r < u)
    {
        return Node();
    }
    if (u <= l and r <= v)
    {
        return st[id];
    }
    int m = (l + r) / 2;
    return Merge(get(id * 2, l, m, u, v), get(id * 2 + 1, m + 1, r, u, v));
}
signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> h[i] >> a[i] >> b[i];
    }
    cin >> q;
    for (int i = 1; i <= q; i++)
    {
        int l, r;
        cin >> l >> r;
        query[r].push_back({l, i});
    }
    for (int i = 1; i <= n; i++)
    {
        if (i + a[i] <= n)
        {
            peal[i + a[i]].push_back({i, 1});
        }
        if (i + b[i] + 1 <= n)
        {
            peal[i + b[i] + 1].push_back({i, -1});
        }
    }
    for (int i = 1; i <= 4 * n; i++)
    {
        lazy[i] = {-INF, INF};
    }
    for (int i = 1; i <= n; i++)
    {
        for (auto v : peal[i])
        {
            if (v.second == 1)
            {
                update(1, 1, n, v.first, h[v.first], h[v.first]);
            }
            else
            {
                update(1, 1, n, v.first, -INF, INF);
            }
        }
        int l = max(1LL, i - b[i]);
        int r = i - a[i];
        if (l <= r)
        {
            update_range(1, 1, n, l, r, h[i]);
        }
        for (auto[l_q, id] : query[i])
        {
            ans[id] = -1;
            ans[id] = max(ans[id], get(1, 1, n, l_q, i).res);
        }
    }
    for (int i = 1; i <= q; i++)
    {
        if (ans[i] < 0) cout << -1 << "\n";
        else cout << ans[i] << "\n";
    }
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |