제출 #1222846

#제출 시각아이디문제언어결과실행 시간메모리
1222846minhpkTwo Antennas (JOI19_antennas)C++20
0 / 100
385 ms72188 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int MAXA = 1000005;
const int MAXST = MAXA * 4;
const long long bruh = (long long)1e16;

int a, c;
struct node { int h, l, r; } z[MAXA];
vector<int> sta[MAXA], fin[MAXA];
struct query { int l, r, id; } q[MAXA];
int res[MAXA];

bool cmp(query A, query B) {
    return A.r < B.r;
}

long long f[MAXST], f1[MAXST], lazy[MAXST];

void push(int id) {
    if (lazy[id] != -bruh) {
        f1[id] = max(f1[id], lazy[id] - f[id]);
        int lc = id << 1, rc = lc | 1;
        lazy[lc] = max(lazy[lc], lazy[id]);
        lazy[rc] = max(lazy[rc], lazy[id]);
        lazy[id] = -bruh;
    }
}

void build(int id, int l, int r) {
    lazy[id] = -bruh;
    f[id] = bruh;
    f1[id] = -bruh;
    if (l == r) return;
    int mid = (l + r) >> 1;
    build(id<<1,    l,     mid);
    build(id<<1|1, mid+1,    r);
}

void update(int id, int l, int r, int pos, int val) {
    push(id);
    if (l == r) {
        f[id] = val;
        return;
    }
    int mid = (l + r) >> 1;
    if (pos <= mid) update(id<<1, l, mid, pos, val);
    else            update(id<<1|1, mid+1, r, pos, val);
    f[id]  = min(f[id<<1],  f[id<<1|1]);
    f1[id] = max(f1[id<<1], f1[id<<1|1]);
}

void update1(int id, int l, int r, int x, int y, int val) {
    push(id);
    if (y < l || r < x) return;
    if (x <= l && r <= y) {
        lazy[id] = max(lazy[id], val);
        push(id);
        return;
    }
    int mid = (l + r) >> 1;
    update1(id<<1,    l,   mid, x, y, val);
    update1(id<<1|1, mid+1, r, x, y, val);
    f[id]  = min(f[id<<1],  f[id<<1|1]);
    f1[id] = max(f1[id<<1], f1[id<<1|1]);
}

int get(int id, int l, int r, int x, int y) {
    push(id);
    if (y < l || r < x) return -bruh;
    if (x <= l && r <= y) return f1[id];
    int mid = (l + r) >> 1;
    return max(
        get(id<<1,    l,   mid, x, y),
        get(id<<1|1, mid+1, r, x, y)
    );
}

void check() {
    build(1, 1, a);
    int cnt = 0;
    for (int i = 1; i <= c; i++) {
        int L = q[i].l, R = q[i].r, idx = q[i].id;
        while (cnt < R) {
            cnt++;
            for (int p : sta[cnt]) {
                update(1, 1, a, p, z[p].h);
            }
            for (int p : fin[cnt]) {
                update(1, 1, a, p, 2*bruh);
            }
            int lo = max(1LL, cnt - z[cnt].r);
            int hi = max(1LL, cnt - z[cnt].l);
            if (lo <= hi)
                update1(1, 1, a, lo, hi, z[cnt].h);
        }
        res[idx] = max(res[idx], get(1, 1, a, L, R));
    }
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> a;
    for (int i = 1; i <= a; i++) {
        cin >> z[i].h >> z[i].l >> z[i].r;
        if (i + z[i].l <= a)          sta[i + z[i].l].push_back(i);
        if (i + z[i].r + 1 <= a)      fin[i + z[i].r + 1].push_back(i);
    }
    cin >> c;
    for (int i = 1; i <= c; i++) {
        cin >> q[i].l >> q[i].r;
        q[i].id = i;
    }
    sort(q+1, q+1+c, cmp);
    for (int i = 1; i <= c; i++) res[i] = -1;

    check();
    for (int i = 1; i <= a; i++) {
        z[i].h = bruh - z[i].h;
        sta[i].clear();
        fin[i].clear();
    }
    for (int i = 1; i <= a; i++) {
        if (i + z[i].l <= a)          sta[i + z[i].l].push_back(i);
        if (i + z[i].r + 1 <= a)      fin[i + z[i].r + 1].push_back(i);
    }
    check();

    for (int i = 1; i <= c; i++) {
        cout << res[i] << "\n";
    }
    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...