Submission #1354405

#TimeUsernameProblemLanguageResultExecution timeMemory
1354405jumpTriple Jump (JOI19_jumps)C++20
0 / 100
58 ms35780 KiB
#include <bits/stdc++.h>
//#define int long long
const int N=500010;
const int mul = 4;
int arr[N];
int ans[N];
std::vector<std::pair<int,int>> query[N];
std::vector<int> bPair[N];
class Segtree{
    int seg[N*mul],Cv[N*mul],Lz[N*mul];
    public:
    void build(int c,int l,int r){
        if(l==r){
            Cv[c]=arr[l];//c value const
            seg[c]=-1e9;//a+b value
        }
        int mid=(l+r)/2;
        build(c*2,l,mid);
        build(c*2+1,mid+1,r);
        Cv[c]=std::max(Cv[c*2],Cv[c*2+1]);
    }
    void push(int c){
        if(c*2<N*mul)Lz[c*2]=std::max(Lz[c*2],Lz[c]);
        if(c*2+1<N*mul)Lz[c*2+1]=std::max(Lz[c*2+1],Lz[c]);
        seg[c]=std::max(seg[c],Lz[c]);
        Lz[c]=-1e9;
    }
    void update(int c,int l,int r,int ql,int qr,int v){
        push(c);
        if(ql<=l&&r<=qr){
            Lz[c]=v;
        }
        if(qr<l||ql>r)return;
        int mid = (l+r)/2;
        update(c*2,l,mid,ql,qr,v);
        update(c*2+1,mid+1,r,ql,qr,v);
    }
    int get(int c,int l,int r,int ql,int qr){
        push(c);
        if(ql<=l&&r<=qr){
            return Cv[c]+seg[c];
        }
        if(qr<l||ql>r)return -1e9;
        int mid = (l+r)/2;
        return std::max(get(c,l,mid,ql,qr),get(c,mid+1,r,ql,qr));
    }
};
signed main(){
    int n,q;
    std::cin >> n;
    for(int i=1;i<=n;i++)std::cin >> arr[i];
    std::cin >> q;
    for(int i=1;i<=q;i++){
        int l,r;
        std::cin >> l >> r;
        query[l].push_back({r,i});
    }
    std::stack<int> stk;
    for(int i=1;i<=n;i++){
        while(!stk.empty()&&arr[stk.top()]<arr[i])stk.pop();
        if(!stk.empty())bPair[stk.top()].push_back(i);
        stk.push(i);
    }
    while(!stk.empty())stk.pop();
    for(int i=n;i>=1;i--){
        while(!stk.empty()&&arr[stk.top()]<arr[i])stk.pop();
        if(!stk.empty())bPair[i].push_back(stk.top());
        stk.push(i);
    }
    Segtree st;
    st.build(1,1,n);
    for(int i=n;i>=1;i--){
        for(auto r:bPair[i]){
            int cMP = r+(r-i);
            st.update(1,1,N,cMP,N,arr[i]+arr[r]);
        }
        for(auto [r,ai]:query[i]){
            ans[ai]=st.get(1,1,N,i,r);
        }
    }
    for(int i=1;i<=q;i++){
        std::cout << ans[i] << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...