Submission #1103276

#TimeUsernameProblemLanguageResultExecution timeMemory
1103276dwuyTwo Antennas (JOI19_antennas)C++14
100 / 100
673 ms84812 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int INF = 1.05e9;

struct Node{
    int mxA, mnA, mxB, mnB;
    int cost;
    Node(){
        mxA = mxB = -INF;
        mnA = mnB = INF;
        cost = -INF;
    }  
};

struct SMT{
    int n;
    vector<Node> tree;

    SMT(int n = 0) : n(n), tree(n<<2|3, Node()) {}

    void down(int id){
        if(tree[id].mxB == -INF && tree[id].mnB == INF) return;
        int mx = tree[id].mxB;
        int mn = tree[id].mnB;
        int ID = id<<1;
        tree[ID].mxB = max(tree[ID].mxB, mx);
        tree[ID].mnB = min(tree[ID].mnB, mn);
        tree[ID].cost = max(tree[ID].cost, tree[ID].mxA - tree[ID].mnB);
        tree[ID].cost = max(tree[ID].cost, tree[ID].mxB - tree[ID].mnA);
        tree[ID|1].mxB = max(tree[ID|1].mxB, mx);
        tree[ID|1].mnB = min(tree[ID|1].mnB, mn);
        tree[ID|1].cost = max(tree[ID|1].cost, tree[ID|1].mxA - tree[ID|1].mnB);
        tree[ID|1].cost = max(tree[ID|1].cost, tree[ID|1].mxB - tree[ID|1].mnA);
        tree[id].mxB = -INF;
        tree[id].mnB = INF;
    }

    void updateA(int pos, int val){
        int id = 1;
        for(int lo=1, hi=n; lo<hi;){
            int mid = (lo + hi)>>1;
            down(id);
            if(pos <= mid) id = id<<1, hi = mid;
            else lo = mid + 1, id = id<<1 | 1;
        }
        tree[id].mxA = tree[id].mnA = val;
        tree[id].mxB = -INF;
        tree[id].mnB = INF;
        for(id>>=1; id; id>>=1){
            tree[id].cost = max(tree[id<<1].cost, tree[id<<1|1].cost);
            tree[id].mxA = max(tree[id<<1].mxA, tree[id<<1|1].mxA);
            tree[id].mnA = min(tree[id<<1].mnA, tree[id<<1|1].mnA);
        }
    }

    void deleteA(int pos){
        int id = 1;
        for(int lo=1, hi=n; lo<hi;){
            int mid = (lo + hi)>>1;
            down(id);
            if(pos <= mid) id = id<<1, hi = mid;
            else lo = mid + 1, id = id<<1 | 1;
        }
        tree[id].mxA = tree[id].mxB = -INF;
        tree[id].mnA = tree[id].mnB = INF;
        for(id>>=1; id; id>>=1){
            tree[id].cost = max(tree[id<<1].cost, tree[id<<1|1].cost);
            tree[id].mxA = max(tree[id<<1].mxA, tree[id<<1|1].mxA);
            tree[id].mnA = min(tree[id<<1].mnA, tree[id<<1|1].mnA);
        }
    }

    void updateB(int l, int r, int id, const int &u, const int &v, const int &val){
        if(l > v || r < u) return;
        if(l >= u && r <= v){
            tree[id].mxB = max(tree[id].mxB, val);
            tree[id].mnB = min(tree[id].mnB, val);
            tree[id].cost = max(tree[id].cost, tree[id].mxB - tree[id].mnA);
            tree[id].cost = max(tree[id].cost, tree[id].mxA - tree[id].mnB);
            return;
        }
        down(id);
        int mid = (l + r)>>1;
        updateB(l, mid, id<<1, u, v, val);
        updateB(mid + 1, r, id<<1|1, u, v, val);
        tree[id].cost = max(tree[id<<1].cost, tree[id<<1|1].cost);
        tree[id].mxA = max(tree[id<<1].mxA, tree[id<<1|1].mxA);
        tree[id].mnA = min(tree[id<<1].mnA, tree[id<<1|1].mnA);
    }

    void updateB(int l, int r, int val){
        updateB(1, n, 1, l, r, val);
    }

    int get(int l, int r, int id, const int &u, const int &v){
        if(l > v || r < u) return -1;
        if(l >= u && r <= v) return tree[id].cost;
        down(id);
        int mid = (l + r)>>1;
        return max(get(l, mid, id<<1, u, v), get(mid + 1, r, id<<1|1, u, v));
    }

    int get(int l, int r){
        return get(1, n, 1, l, r);
    }
};

const int MX = 400005;
int n, q;
int h[MX], a[MX], b[MX];
int ans[MX];
vector<int> G[MX];
vector<pair<int, int>> T[MX];

void nhap(){
    cin >> n;
    for(int i=1; i<=n; i++){
        cin >> h[i] >> a[i] >> b[i];
        G[i + a[i]].push_back(i);
        G[i + b[i] + 1].push_back(-i);
    }
    cin >> q;
    for(int i=1; i<=q; i++){
        int l, r;
        cin >> l >> r;
        T[r].push_back({l, i});
    }
}

void solve(){
    SMT smt(n);
    for(int i=1; i<=n; i++){
        for(int j: G[i]){
            if(j > 0) smt.updateA(j, h[j]);
            if(j < 0) smt.deleteA(-j);
        }
        smt.updateB(i - b[i], i - a[i], h[i]);
        for(pair<int, int> qr: T[i]){
            int j, id;
            tie(j, id) = qr;
            ans[id] = smt.get(j, i);
            if(ans[id] < 0) ans[id] = -1;
        }
    }
    for(int i=1; i<=q; i++) cout << ans[i] << endl;
}

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    nhap();
    solve();

    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...