Submission #1280069

#TimeUsernameProblemLanguageResultExecution timeMemory
1280069ZeroCoolTwo Antennas (JOI19_antennas)C++20
22 / 100
255 ms38428 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>

using namespace std;;
using namespace __gnu_pbds;

template<typename T>
using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;


#define ll long long
#define ar array
#define ld double
#define int long long
#define all(v) v.begin(), v.end()
 #pragma GCC optimize("O3,Ofast,unroll-loops")

const int N = 5e5 + 20;
const int K = 467;
const int M = 20;
const int LOG = 20;
const int INF = 1e15;	
int MOD = 1e9 + 7;
const ld EPS = 1e-12;

template<typename T>
inline void chmin(T &x,T y){x = min(x, y);}
template<typename T>
inline void chmax(T &x,T y){x = max(x, y);}
inline void mm(int &x){x = (x % MOD + MOD) % MOD;};

struct Node{
    int lz;
    int ans;
    int mx;

    Node(){
        ans = -1, mx = -INF, lz = INF;
    }
    Node(int a,int b,int c){
        ans = a, mx = b, lz = c;
    }
};

Node operator+(Node a, Node b){
    Node ret;
    ret.ans = max(a.ans, b.ans);
    ret.mx = max(a.mx, b.mx);
    ret.lz = INF;
    return ret;
}

struct SGT{
    vector<Node> s;

    SGT(int n){
        s.resize(4 * n);
    }
    void psh(int k,int tl,int tr){
        chmax(s[k].ans, s[k].mx -s[k].lz);
        if(tl != tr){
            chmin(s[k * 2].lz, s[k].lz);
            chmin(s[k * 2 + 1].lz, s[k].lz);
        }
        s[k].lz = INF;
    }

    void upd1(int k,int tl,int tr,int p,int v){
        psh(k, tl, tr);
        if(tl == tr){
            s[k].mx = v;
            // psh(k, tl, tr);
            return;
        }
        int tm = (tl + tr) / 2;
        if(p <= tm)upd1(k * 2, tl, tm, p, v);
        else upd1(k * 2 + 1, tm + 1, tr, p, v);
        psh(k * 2, tl, tm);
        psh(k * 2 + 1, tm + 1, tr);
        s[k] = s[k * 2] + s[k * 2 + 1];
    }

    void upd2(int k,int tl,int tr,int l,int r,int v){
        psh(k, tl, tr);
        if(l > tr || tl > r || l > r)return;
        if(l <= tl && tr <= r){
            s[k].lz = v;
            psh(k, tl, tr);
            return;
        }
        int tm = (tl + tr) / 2;
        upd2(k * 2, tl, tm, l, r, v);
        upd2(k * 2 + 1, tm + 1, tr, l, r, v);
        // psh(k * 2, tl, tm);
        // psh(k * 2 + 1, tm + 1, tr);
        s[k] = s[k * 2] + s[k * 2 + 1];
    }

    int qry(int k,int tl,int tr,int l,int r){
        if(l > tr || tl > r || l > r)return -1;
        if(l <= tl && tr <= r)return s[k].ans;
        int tm = (tl + tr) / 2;
        return max(qry(k * 2, tl, tm, l, r), qry(k * 2 + 1, tm + 1, tr, l, r));
    }
};

void orz(){
    int n;
    cin>>n;
    int A[n], L[n], R[n];
    for(int i =0 ;i < n;i++)cin>>A[i]>>L[i]>>R[i];
    int q;
    cin>>q;
    ar<int,2> Q[q];
    for(int i = 0;i < q;i++){
        int l, r;
        cin>>l>>r;
        --l, --r;
        Q[i] = {l, r};
    } 
    int ans[q];
    memset(ans, -1, sizeof ans);
    for(int it = 0;it < 2;it++){
        vector<ar<int,2>> ev[n];

        for(int i = 0;i < n;i++){
            int l = i + L[i];
            int r = i + R[i];
            if(l < n)ev[l].push_back({i, 1});
            if(r + 1 < n)ev[r + 1].push_back({i, -1});
        }
        vector<int> que[n];
        for(int i = 0;i < q;i++)que[Q[i][1]].push_back(i);
        
       SGT sgt(n);

        for(int i = 0;i < n;i++){
            for(auto [j, b]: ev[i]){
                if(b > 0)sgt.upd1(1, 0, n - 1, j, A[j]);
               else sgt.upd1(1, 0, n - 1, j, -INF);
            }
           sgt.upd2(1, 0, n - 1, max(0ll, i - R[i]), i - L[i], A[i]);
            for(auto j: que[i]){
                auto [l, r] = Q[j];
               chmax(ans[j], sgt.qry(1, 0, n - 1,l, r));
            }
            
        }


        reverse(A, A + n);
        reverse(L, L + n);
        reverse(R, R + n);
        for(int i = 0;i < q;i++){
            Q[i][0] = n - Q[i][0] - 1;
            Q[i][1] = n - Q[i][1] - 1;
            swap(Q[i][0], Q[i][1]);
        }
    }
    for(int i = 0;i < q;i++)cout<<ans[i]<<'\n';
    cout<<'\n';
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    //  cin>>t;
    while (t--)orz();
}  
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...