제출 #1222880

#제출 시각아이디문제언어결과실행 시간메모리
1222880minhpkTwo Antennas (JOI19_antennas)C++20
22 / 100
351 ms72192 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) {
        push(id << 1 | 1);
        update(id << 1, l, mid, pos, val);
    } else {
        push(id << 1);
        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 = a + 1; i < MAXA; ++i) {
        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...