Submission #1207788

#TimeUsernameProblemLanguageResultExecution timeMemory
1207788Hamed_GhaffariTwo Antennas (JOI19_antennas)C++20
100 / 100
521 ms40060 KiB
#include <bits/stdc++.h>
using namespace std;

#define lc id<<1
#define rc lc|1
#define mid ((l+r)>>1)
#define maxs(a,b) (a=max(a,b))

const int MXN = 2e5+5, inf = 1e9;

int n;

int seg[MXN<<2], hseg[MXN<<2], lz[MXN<<2], hlz[MXN<<2];

inline void pull(int id) {
    seg[id] = max(seg[lc], seg[rc]);
    hseg[id] = max(hseg[lc], hseg[rc]);
}
void build(int l=1, int r=n+1, int id=1) {
    lz[id] = 0, hlz[id] = 0;
    seg[id] = hseg[id] = -inf;
    if(r-l == 1) return;
    build(l, mid, lc);
    build(mid, r, rc);
}
inline void apply(int x, int hx, int id) {
    hseg[id] = max(hseg[id], seg[id]+hx);
    seg[id] += x;
    hlz[id] = max(hlz[id], lz[id]+hx);
    lz[id] += x;
}
inline void push(int id) {
    if(lz[id] || hlz[id]) {
        apply(lz[id], hlz[id], lc);
        apply(lz[id], hlz[id], rc);
        lz[id] = hlz[id] = 0;
    }
}
void upd(int s, int e, int x, int l=1, int r=n+1, int id=1) {
    if(s>=r || l>=e) return;
    if(s<=l && r<=e) {
        apply(x, max(x, 0), id);
        return;
    }
    push(id);
    upd(s, e, x, l, mid, lc);
    upd(s, e, x, mid, r, rc);
    pull(id);
}
int get(int s, int e, int l=1, int r=n+1, int id=1) {
    if(s>=r || l>=e) return -inf;
    if(s<=l && r<=e) return hseg[id];
    push(id);
    return max(get(s, e, l, mid, lc), get(s, e, mid, r, rc));
}

int q, H[MXN], A[MXN], B[MXN], L[MXN], R[MXN], ans[MXN];
vector<int> Q[MXN], add[MXN], rem[MXN];

void solve() {
    for(int i=1; i<=q; i++) Q[R[i]].push_back(i);
    for(int i=1; i<=n; i++) {
        if(i+A[i]<=n) add[i+A[i]].push_back(i);
        if(i+B[i]+1<=n) rem[i+B[i]+1].push_back(i);
    }
    build();
    for(int r=1; r<=n; r++) {
        for(int i : add[r]) upd(i, i+1, inf-H[i]);
        for(int i : rem[r]) upd(i, i+1, -inf+H[i]);
        if(r-A[r]>=1) {
            upd(max(1, r-B[r]), r-A[r]+1, H[r]);
            upd(max(1, r-B[r]), r-A[r]+1, -H[r]);
        }
        for(int i : Q[r])
            ans[i] = max(ans[i], get(L[i], R[i]+1));
    }
    for(int i=1; i<=n; i++) {
        Q[i].clear();
        add[i].clear();
        rem[i].clear();
    }
}

int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(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 >> L[i] >> R[i], ans[i]=-inf;
    solve();
    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++) {
        L[i] = n+1-L[i];
        R[i] = n+1-R[i];
        swap(L[i], R[i]);
    }
    solve();
    for(int i=1; i<=q; i++)
        cout << (ans[i]<0 ? -1 : ans[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...