제출 #1242874

#제출 시각아이디문제언어결과실행 시간메모리
1242874quannnguyen2009Two Antennas (JOI19_antennas)C++20
100 / 100
349 ms62692 KiB
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pb push_back
#define ii pair<int, int>
#define sz(v) (int)v.size()
#define all(v) v.begin(), v.end()
using namespace std;

const int N = 2e5+5, mod = 1e9+7, inf = 1e18;

int n, q, f;
int h[N], a[N], b[N], ans[N];
vector<int> on[N], off[N];
vector<ii> que[N];

int seg_mx[4*N], seg_mn[4*N], l_mx[4*N], l_mn[4*N], seg[4*N];

void push(int node) {
    l_mx[node<<1] = max(l_mx[node<<1], l_mx[node]);
    l_mx[node<<1|1] = max(l_mx[node<<1|1], l_mx[node]);
    l_mn[node<<1] = min(l_mn[node<<1], l_mn[node]);
    l_mn[node<<1|1] = min(l_mn[node<<1|1], l_mn[node]);
    seg[node<<1] = max(seg[node<<1], max(seg_mx[node<<1]-l_mn[node], l_mx[node]-seg_mn[node<<1]));
    seg[node<<1|1] = max(seg[node<<1|1], max(seg_mx[node<<1|1]-l_mn[node], l_mx[node]-seg_mn[node<<1|1]));
    l_mx[node] = -inf, l_mn[node] = inf;
}

void upd1(int node, int l, int r, int idx, int v) {
    if (idx<l || idx>r) return;
    if (l==r) {
        if (v==inf) {
            seg_mx[node] = -inf;
            seg_mn[node] = inf;
        } else {
            seg_mx[node] = seg_mn[node] = v;
        }
        return;
    }
    push(node);
    int mid = (l+r)>>1;
    upd1(node<<1, l, mid, idx, v);
    upd1(node<<1|1, mid+1, r, idx, v);
    seg_mx[node] = max(seg_mx[node<<1], seg_mx[node<<1|1]);
    seg_mn[node] = min(seg_mn[node<<1], seg_mn[node<<1|1]);
    seg[node] = max(seg[node<<1], seg[node<<1|1]);
}

void upd2(int node, int l, int r, int ql, int qr, int v) {
    if (l>qr || r<ql) return;
    else if (ql<=l && r<=qr) {
        l_mx[node] = max(l_mx[node], v);
        l_mn[node] = min(l_mn[node], v);
        seg[node] = max(seg[node], max(seg_mx[node]-v, v-seg_mn[node]));
        return;
    }
    push(node);
    int mid = (l+r)>>1;
    upd2(node<<1, l, mid, ql, qr, v);
    upd2(node<<1|1, mid+1, r, ql, qr, v);
    seg[node] = max(seg[node<<1], seg[node<<1|1]);
}

int get(int node, int l, int r, int ql, int qr) {
    if (l>qr || r<ql) return -inf;
    else if (ql<=l && r<=qr) return seg[node];
    push(node);
    int mid = (l+r)>>1;
    return max(get(node<<1, l, mid, ql, qr), get(node<<1|1, mid+1, r, ql, qr));
}

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];
        if (i+a[i]<=n) on[i+a[i]].pb(i);
        if (i+b[i]+1<=n) off[i+b[i]+1].pb(i);
    }
    for (int i=0; i<4*N; i++) {
        seg_mx[i] = seg[i] = l_mx[i] = -inf;
        seg_mn[i] = l_mn[i] = inf;
    }
    cin >> q;
    for (int i=1; i<=q; i++) {
        int l, r; cin >> l >> r;
        que[r].pb({i, l});
        ans[i] = -1;
    }
    for (int i=1; i<=n; i++) {
        for (int it: on[i]) upd1(1, 1, n, it, h[it]);
        for (int it: off[i]) upd1(1, 1, n, it, inf);
        if (i-a[i]>=1) upd2(1, 1, n, max(i-b[i], 1ll), i-a[i], h[i]);
        for (auto [id, l] : que[i]) ans[id] = max(ans[id], get(1, 1, n, l, i));
    }
    for (int i=1; i<=q; i++) cout << 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...