Submission #1295875

#TimeUsernameProblemLanguageResultExecution timeMemory
1295875peanutTwo Antennas (JOI19_antennas)C++20
13 / 100
195 ms35232 KiB
#include <bits/stdc++.h>

using namespace std;
const int maxn = 2e5 + 5;

int n, q;
int h[maxn], a[maxn], b[maxn];
pair<int, int> queries[maxn];
namespace subtask12 {
    bool check() {return n <= 2000;}
    void solve() {
        vector<vector<int>> L(n+1, vector<int>(n+1, -1));
        for (int i = 1; i <= n; ++i) {
            if (i+a[i] > n) continue;
            for (int j = i+a[i]; j <= min(n, i+b[i]); ++j) {
                L[i][j] = L[i][j-1];
                if (j-b[j] <= i && i <= j-a[j]) L[i][j] = max(L[i][j], abs(h[i] - h[j]));
            }
            for (int j = i+b[i]+1; j <= n; ++j) L[i][j] = L[i][j-1];
        }
        vector<vector<int>> ans(n+1, vector<int>(n+1, -1));
        for (int i = 1; i <= n; ++i) {
            for (int j = i-1; j >= 1; --j) ans[j][i] = max(ans[j+1][i], L[j][i]);
        }
        for (int i = 1; i <= q; ++i) cout << ans[queries[i].first][queries[i].second] << '\n';
    }
}

namespace subtask3 {
    bool check() {return q == 1 && queries[1].first == 1 && queries[1].second == n;}
    struct evt {
        int pos, idx, type;
    };
    struct SMT {
        vector<int> st;
        SMT(int n): st(4*n, -1) {}
        void upd(int id, int l, int r, int u, int val) {
            if (l == r) {
                st[id] = val;
                return ;
            }
            int mid = (l + r) >> 1;
            if (u <= mid) upd(id << 1, l, mid, u, val);
            else upd(id << 1 | 1, mid + 1, r, u, val);
            st[id] = max(st[id << 1], st[id << 1 | 1]);
        }
        int get(int id, int l, int r, int u, int v) {
            if (r < u || l > v) return -1;
            if (u <= l && r <= v) return st[id];
            int mid = (l + r) >> 1;
            return max(get(id << 1, l, mid, u, v), get(id << 1 | 1, mid + 1, r, u, v));
        }
    };
    int right() {
        SMT seg(n);
        vector<evt> events;
        for (int i = 1; i <= n; ++i) {
            events.push_back({i+a[i], i, 1});
            events.push_back({i+b[i]+1, i, 0});
        }
        sort(events.begin(), events.end(), [](evt &a, evt &b) {return a.pos < b.pos;});
        int j = 0;
        int res = -1;
        for (int i = 1; i <= n; ++i) {
            while (j < events.size() && events[j].pos <= i) {
                if (events[j].type) seg.upd(1, 1, n, events[j].idx, h[events[j].idx]);
                else seg.upd(1, 1, n, events[j].idx, -1);
                ++j;
            }
            if (i-a[i] < 1) continue;
            int idfk = seg.get(1, 1, n, max(1, i-b[i]), i-a[i]);
            if (idfk != -1) res = max(res, h[i] - idfk);
        }
        return res;
    }
    int left() {
        SMT seg(n);
        vector<evt> events;
        for (int i = 1; i <= n; ++i) {
            events.push_back({i-a[i], i, 1});
            events.push_back({i-b[i]-1, i, 0});
        }
        sort(events.begin(), events.end(), [](evt &a, evt &b) {return a.pos > b.pos;});
        int j = 0;
        int res = -1;
        for (int i = n; i >= 1; --i) {
            while (j < events.size() && events[j].pos >= i) {
                if (events[j].type) seg.upd(1, 1, n, events[j].idx, h[events[j].idx]);
                else seg.upd(1, 1, n, events[j].idx, -1);
                ++j;
            }
            if (i+a[i] > n) continue;
            int idfk = seg.get(1, 1, n, i+a[i], min(n, i+b[i]));
            if (idfk != -1) res = max(res, idfk - h[i]);
        }
        return res;
    }
    void solve() {
        cout << max(left(), right());
    }
}
int main() {
    ios::sync_with_stdio(false); cin.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) cin >> queries[i].first >> queries[i].second;
    if (subtask12::check()) subtask12::solve();
    else if (subtask3::check()) subtask3::solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...