Submission #1149294

#TimeUsernameProblemLanguageResultExecution timeMemory
1149294adaawfTwo Antennas (JOI19_antennas)C++20
0 / 100
176 ms40384 KiB
#include <iostream>
#include <vector>
using namespace std;
vector<int> g[200005];
vector<pair<int, int>> gg[200005];
int hh = 2e9, res[200005], h[200005], a[200005], b[200005];
long long int lazy[800005], lazy2[800005];
struct HEIT {
    long long int c, mi, ma, res;
} e, t[800005];
HEIT Merge(HEIT aa, HEIT bb) {
    HEIT res;
    res.c = aa.c + bb.c;
    res.mi = min(aa.mi, bb.mi);
    res.ma = max(aa.ma, bb.ma);
    res.res = max(aa.res, bb.res);
    return res;
}
void apply(int v, long long int x, long long int y) {
    if (t[v].c == 0) return;
    t[v].res = max(t[v].res, x - t[v].mi);
    t[v].res = max(t[v].res, t[v].ma - y);
    lazy[v] = max(lazy[v], x);
    lazy2[v] = min(lazy2[v], y);
}
void push(int v) {
    apply(v << 1, lazy[v], lazy2[v]);
    apply(v << 1 | 1, lazy[v], lazy2[v]);
    lazy[v] = -hh; lazy2[v] = hh;
}
void build(int v, int tl, int tr) {
    t[v] = e;
    lazy[v] = -hh; lazy2[v] = hh;
    if (tl == tr) {
        return;
    }
    int mid = (tl + tr) >> 1;
    build(v << 1, tl, mid);
    build(v << 1, mid + 1, tr);
}
void update(int v, int tl, int tr, int l, int r, long long int x) {
    if (l > r) return;
    if (tl == l && tr == r) {
        apply(v, x, x);
        return;
    }
    push(v);
    int mid = (tl + tr) >> 1;
    update(v << 1, tl, mid, l, min(r, mid), x);
    update(v << 1 | 1, mid + 1, tr, max(l, mid + 1), r, x);
    t[v] = Merge(t[v << 1], t[v << 1 | 1]);
}
void update(int v, int tl, int tr, int x) {
    if (tl == tr) {
        if (t[v].c == 0) {
            t[v].c = 1;
            t[v].mi = t[v].ma = h[x];
            t[v].res = -hh;
        }
        else {
            t[v].c = 0;
            t[v].mi = hh; t[v].ma = -hh;
        }
        return;
    }
    push(v);
    int mid = (tl + tr) >> 1;
    if (mid >= x) update(v << 1, tl, mid, x);
    else update(v << 1 | 1, mid + 1, tr, x);
    t[v] = Merge(t[v << 1], t[v << 1 | 1]);
}
long long int sum(int v, int tl, int tr, int l, int r) {
    if (l > r) return -hh;
    if (tl == l && tr == r) {
        return t[v].res;
    }
    push(v);
    int mid = (tl + tr) >> 1;
    return max(sum(v << 1, tl, mid, l, min(r, mid)), sum(v << 1 | 1, mid + 1, tr, max(l, mid + 1), r));
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    e = {0, hh, -hh, -hh};
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> h[i] >> a[i] >> b[i];
        g[max(i - a[i], 0)].push_back(i);
        g[max(i - b[i] - 1, 0)].push_back(i);
    }
    int q;
    cin >> q;
    for (int i = 0; i < q; i++) {
        int l, r;
        cin >> l >> r;
        gg[l].push_back({r, i});
    }
    build(1, 1, n);
    for (int i = n; i >= 1; i--) {
        for (int w : g[i]) {
            update(1, 1, n, w);
        }
        int l = i + a[i], r = i + b[i];
        if (l <= n) {
            r = min(r, n);
            update(1, 1, n, l, r, h[i]);
        }
        for (auto w : gg[i]) {
            long long int k = sum(1, 1, n, i, w.first);
            if (k < 0) res[w.second] = -1;
            else res[w.second] = k;
        }
    }
    for (int i = 0; i < q; i++) cout << res[i] << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...