Submission #1330445

#TimeUsernameProblemLanguageResultExecution timeMemory
1330445wedonttalkanymoreTwo Antennas (JOI19_antennas)C++20
In queue
0 ms0 KiB
#include <bits/stdc++.h>
/*
    Chang ki si xuyen man dem
    Di lac vao trong giac mong
*/
using namespace std;
using ll = long long;

#define int long long
#define pii pair<ll, ll>
#define fi first
#define se second

const ll N = 5e5 + 5, inf = 1e18, mod = 1e9 + 7, block = 320, lim = 19;

int n, q;
int h[N], a[N], b[N];
pii qry[N];
vector <int> add[N];
vector <int> del[N];
vector <pii> query[N];

struct ST {
    int st[4 * N + 5], lz[4 * N + 5], res[4 * N + 5]; // st save max, lz save min 
    void reset() {
        for (int i = 1; i < 4 * N; i++) {
            st[i] = 0;
            res[i] = -1;
            lz[i] = inf;
        }
    }
    void push(int i, int l, int r) {
        st[i] = max(st[2 * i], st[2 * i + 1]);
        res[i] = max(res[2 * i], res[2 * i + 1]);
    }
    void lazy(int i, int l, int r) {
        if (lz[i] != inf) {
            if (l < r) {
                lz[2 * i] = min(lz[2 * i], lz[i]);
                lz[2 * i + 1] = min(lz[2 * i + 1], lz[i]);
                res[2 * i] = max(res[2 * i], st[2 * i] - lz[i]);
                res[2 * i + 1] = max(res[2 * i + 1], st[2 * i + 1] - lz[i]);
            }
            lz[i] = inf;
        }
    }
    void update(int i, int l, int r, int pos, int val) { // update i for j > i
        if (l == r) {
            st[i] = val;
            return;
        }
        lazy(i, l, r);
        int mid = (l + r) / 2;
        if (pos <= mid) update(2 * i, l, mid, pos, val);
        else update(2 * i + 1, mid + 1, r, pos, val);
        push(i, l, r);
    }
    void add(int i, int l, int r, int u, int v, int val) { // result for i
        if (u > r || v < l) return;
        if (u <= l && r <= v) {
            res[i] = max(res[i], st[i] - val);
            lz[i] = min(lz[i], val);
            return;
        }
        int mid = (l + r) / 2;
        lazy(i, l, r);
        add(2 * i, l, mid, u, v, val);
        add(2 * i + 1, mid + 1, r, u, v, val);
        push(i, l, r);
    }
    int get(int i, int l, int r, int u, int v) {
        if (u > r || v < l) return -1;
        if (u <= l && r <= v) return res[i];
        int mid = (l + r) / 2;
        lazy(i, l, r);
        return max(get(2 * i, l, mid, u, v), get(2 * i + 1, mid + 1, r, u, v));
    }
} st;

int ans[N];

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    if (fopen(".inp", "r")) {
        freopen(".inp", "r", stdin);
        freopen(".out", "w", stdout);
    }
    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++) {
        cin >> qry[i].fi >> qry[i].se;
        ans[i] = -1;
    }
    for (int t = 0; t < 2; t++) {
        for (int i = 1; i <= n; i++) {
            add[i].clear(); del[i].clear();
        }
        for (int i = 1; i <= n; i++) {
            query[i].clear();
        }
        for (int i = 1; i <= n; i++) {
            add[i + a[i]].emplace_back(i);
            del[i + b[i] + 1].emplace_back(i);
        }
        for (int i = 1; i <= q; i++) {
            query[qry[i].se].emplace_back(qry[i].fi, i);
        }
        st.reset();
        for (int i = 1; i <= n; i++) {
            for (auto x : add[i]) {
                st.update(1, 1, n, x, h[x]);
            }
            for (auto x : del[i]) {
                st.update(1, 1, n, x, 0);
            }
            st.add(1, 1, n, max(1ll, i - b[i]), max(0ll, i - a[i]), h[i]);
            for (auto [L, id] : query[i]) {
                ans[id] = max(ans[id], st.get(1, 1, n, L, i));
            }
        }
        reverse(h + 1, h + n + 1);
        reverse(a + 1, a + n + 1);
        reverse(b + 1, b + n + 1);
        for (int i = 1; i <= q; i++) {
            qry[i].fi = n - qry[i].fi + 1;
            qry[i].se = n - qry[i].se + 1;
            swap(qry[i].fi, qry[i].se);
        }
    }
    for (int i = 1; i <= q; i++) cout << ans[i] << '\n';
    return 0;
}