Submission #1364665

#TimeUsernameProblemLanguageResultExecution timeMemory
1364665anteknneTwo Antennas (JOI19_antennas)C++20
0 / 100
187 ms25572 KiB
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;

#define pb push_back
#define pii pair<int, int>
#define pll pair<ll, ll>
#define st first
#define nd second
#define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
#define debug false

struct node {
    int minn;
    int maks;
    int wyn;
};

const int MAXN = 200 * 1000 + 17;
const int INF = 1000 * 1000 * 1000 + 1;
int h[MAXN];
int a[MAXN];
int b[MAXN];
int wyn[MAXN];
vector<pii> zap[MAXN];
node st[4 * MAXN];
int lazy[4 * MAXN];
vector<int> pocz[MAXN];
vector<int> kon[MAXN];
int n, q;

void buduj (int p, int k, int i) {
    st[i] = {INF, -INF, -INF};
    lazy[i] = INF;
    if (p == k) {
        return;
    }
    int sr  = (p + k)/ 2;
    buduj(p, sr, i * 2);
    buduj(sr + 1, k, i * 2 + 1);
}

void szykuj (int i) {
    if (lazy[i] != INF) {
        if (st[i * 2].maks != -INF) {
            st[i * 2].minn = min(st[i * 2].minn, lazy[i]);
            st[i * 2].wyn = max(st[i * 2].wyn, st[i * 2].maks - lazy[i]);
            lazy[i * 2] = min(lazy[i * 2], lazy[i]);
        }
        if (st[i * 2 + 1].maks != -INF) {
            st[i * 2 + 1].minn = min(st[i * 2 + 1].minn, lazy[i]);
            st[i * 2 + 1].wyn = max(st[i * 2 + 1].wyn, st[i * 2 + 1].maks - lazy[i]);
            lazy[i * 2 + 1] = min(lazy[i * 2 + 1], lazy[i]);
        }
        lazy[i] = INF;
    }
}

void lacz (int i) {
    st[i].minn = min(st[i * 2].minn, st[i * 2 + 1].minn);
    st[i].maks = max(st[i * 2].maks, st[i * 2 + 1].maks);
    st[i].wyn = max(st[i * 2].wyn, st[i * 2 + 1].wyn);
}

void usun (int p, int k, int ind, int i) {
    if (p > ind || k < ind) {
        return;
    }
    if (p == k) {
        st[i] = {INF, -INF, -INF};
        return;
    }
    int sr = (p + k)/ 2;
    szykuj(i);
    usun(p, sr, ind, i * 2);
    usun(sr + 1, k, ind, i * 2 + 1);
    lacz(i);
}

void dodaj (int p, int k, int ind, int i) {
    if (p > ind || k < ind) {
        return;
    }
    if (p == k) {
        st[i] = {INF, h[p], -INF};
        return;
    }
    int sr = (p + k)/ 2;
    szykuj(i);
    dodaj(p, sr, ind, i * 2);
    dodaj(sr + 1, k, ind, i * 2 + 1);
    lacz(i);
}

void minuj (int p, int k, int a, int b, int w, int i) {
    if (p > b || k < a) {
        return;
    }
    if (a <= p && k <= b) {
        lazy[i] = min(lazy[i], w);
        st[i].minn = min(st[i].minn, lazy[i]);
        st[i].wyn = max(st[i].wyn, st[i].maks - st[i].minn);
        return;
    }
    int sr = (p + k)/ 2;
    szykuj(i);
    minuj(p, sr, a, b, w, i * 2);
    minuj(sr + 1, k, a, b, w, i * 2 + 1);
    lacz(i);
}

int odczytaj (int p, int k, int a, int b, int i) {
    if (p > b || k < a) {
        return -INF;
    }
    if (a <= p && k <= b) {
        return st[i].wyn;
    }
    int sr = (p + k)/ 2;
    szykuj(i);
    int w1 = odczytaj(p, sr, a, b, i * 2);
    int w2 = odczytaj(sr + 1, k, a, b, i * 2 + 1);
    lacz(i);
    return max(w1, w2);
}

void rozw () {
    buduj(1, n, 1);

    for (int i = 1; i <= n; i ++) {
        pocz[min(i + a[i], MAXN - 1)].pb(i);
        kon[min(i + b[i], MAXN - 1)].pb(i);

        for (auto x : pocz[i]) {
            dodaj(1, n, x, 1);
        }

        if ((i - a[i]) >= 1) {
            minuj(1, n, max(1, i - b[i]), i - a[i], h[i], 1);
        }

        for (auto x : zap[i]) {
            wyn[x.nd] = max(wyn[x.nd], odczytaj(1, n, x.st, i, 1));
        }

        for (auto x : kon[i]) {
            usun(1, n, x, 1);
        }

        pocz[i].clear();
        kon[i].clear();
    }
}

int main () {
    ios::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];
    }

    cin >> q;
    int l, r;
    for (int i = 0; i < q; i ++) {
        cin >> l >> r;
        zap[r].pb({l, i});
        wyn[i] = -1;
    }

    rozw();
    for (int i = 1; i <= n; i ++) {
        h[i] *= (-1);
    }
    rozw();

    for (int i = 0; i < q; i ++) {
        cout << wyn[i] << "\n";
    }

    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...