Submission #1266673

#TimeUsernameProblemLanguageResultExecution timeMemory
1266673ducanh0811Two Antennas (JOI19_antennas)C++20
22 / 100
323 ms41080 KiB
#include <bits/stdc++.h>
#define int long long
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i)
#define REV(i, a, b) for (int i = (a), _b = (b); i >= _b; --i)
using namespace std;

#define MAXN 200005
const int INF = 1e16;
int n, q, h[MAXN], a[MAXN], b[MAXN];
vector<int> ok[MAXN];
vector<pair<int, int>> query[MAXN];
pair<int, int> save[MAXN];
int res[MAXN];

struct SMT {
    int n;
    vector<int> st, ts, lz;
    SMT(int _n = 0){
        n = _n;
        st.assign((n << 2) + 5, +INF);
        ts.assign((n << 2) + 5, -INF);
        lz.assign((n << 2) + 5, 0);
    }

    void update(int id, int l, int r, int p, int val) {
        if (l == r) return st[id] = val, ts[id] = (val == -INF ? val : ts[id]), void();
        int mid = (l + r) >> 1;
        push(id);
        if (p <= mid) update(id << 1, l, mid, p, val);
            else update(id << 1 | 1, mid + 1, r, p, val);
        st[id] = min(st[id << 1], st[id << 1 | 1]);
        ts[id] = max(ts[id << 1], ts[id << 1 | 1]);
    }
    void update(int p, int val){
        update(1, 1, n, p, val);
    }

    void push(int id){
        if (lz[id] == 0) return;
        lz[id << 1] = max(lz[id << 1], lz[id]);
        lz[id << 1 | 1] = max(lz[id << 1 | 1], lz[id]);
        ts[id << 1] = max(ts[id << 1], lz[id] - st[id << 1]);
        ts[id << 1 | 1] = max(ts[id << 1 | 1], lz[id] - st[id << 1 | 1]);
        lz[id] = 0;
    }

    void updateRange(int id, int l, int r, int u, int v, int val) {
        if (v < l || r < u) return;
        if (u <= l && r <= v){
            ts[id] = max(ts[id], val - st[id]);
            lz[id] = max(lz[id], val);
            return;
        }
        int mid = (l + r) >> 1;
        push(id);
        updateRange(id << 1, l, mid, u, v, val);
        updateRange(id << 1 | 1, mid + 1, r, u, v, val);
        ts[id] = max(ts[id << 1], ts[id << 1 | 1]);
    }
    void updateRange(int u, int v, int val) {
        updateRange(1, 1, n, u, v, val);
    }

    int get(int id, int l, int r, int u, int v) {
        if (v < l || r < u) return -INF;
        if (u <= l && r <= v) return ts[id];
        int mid = (l + r) >> 1;
        push(id);
        return max(get(id << 1, l, mid, u, v), get(id << 1 | 1, mid + 1, r, u, v));
    }
    int get(int u, int v) {
        return get(1, 1, n, u, v);
    }
};

int M(int x){
    x = min(n, x);
    x = max(x, 1ll);
    return x;
}

void process(){
    SMT tree = SMT(n);
    FOR(i, 1, n){
        for (int &x : ok[i]){
            if (x > 0){
                tree.update(+x, h[x]);
            } else {
                tree.update(-x, INF);
            }
        }
        tree.updateRange(M(i - b[i]), M(i - a[i]), h[i]);
        for (pair<int, int> &x : query[i]){
            res[x.second] = max(res[x.second], tree.get(x.first, i));
        }
    }
}

void solve(){
    cin >> n;
    FOR(i, 1, n){
        cin >> h[i] >> a[i] >> b[i];
        ok[M(i + a[i])].push_back(i);
        ok[M(i + b[i]) + 1].push_back(-i);
    }
    cin >> q;
    FOR(i, 1, q){
        int l, r; cin >> l >> r;
        res[i] = -1;
        save[i] = make_pair(l, r);
        query[r].push_back(make_pair(l, i));
    }
    process();
    reverse(h + 1, h + 1 + n);
    reverse(a + 1, a + 1 + n);
    reverse(b + 1, b + 1 + n);
    FOR(i, 1, n) ok[i].clear(), query[i].clear();
    FOR(i, 1, n){
        ok[M(i + a[i])].push_back(i);
        ok[M(i + b[i]) + 1].push_back(-i);
    }
    FOR(i, 1, q){
        int l, r; tie(l, r) = make_pair(n - save[i].second + 1, n - save[i].first + 1);
        query[r].push_back(make_pair(l, i));
    }
    process();
    FOR(i, 1, q){
        cout << res[i] << '\n';
    }
}

#define task ""
int32_t main(){
    if (fopen(task".inp","r")){
        freopen(task".inp","r",stdin);
        freopen(task".out","w",stdout);
    }
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    solve();
    return 0;
}

Compilation message (stderr)

antennas.cpp: In function 'int32_t main()':
antennas.cpp:135:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  135 |         freopen(task".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
antennas.cpp:136:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  136 |         freopen(task".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...