This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef pair <int,int> pp;
int n,A[500002],q;
vector <pp> P;
struct query
{
    int l,r,pos;
    bool operator < (const query&a)
    const
    {
        return (l>a.l);
    }
};
query Q[500002];
long long res[500002];
struct node
{
    long long a,val,vmax;
};
node it[2000002];
void build(int id,int l,int r)
{
    if (l==r)
    {
        it[id].a=A[l];
        return;
    }
    int mid=(l+r)/2;
    build(id*2,l,mid);
    build(id*2+1,mid+1,r);
    it[id].a=max(it[id*2].a,it[id*2+1].a);
}
void down(int id)
{
    long long t=it[id].vmax;
    it[id*2].vmax=max(it[id*2].vmax,t);it[id*2].val=max(it[id*2].val,it[id*2].a+t);
    it[id*2+1].vmax=max(it[id*2+1].vmax,t);it[id*2+1].val=max(it[id*2+1].val,it[id*2+1].a+t);
}
void update(int id,int l,int r,int a,int b,long long val)
{
    if (l>b||r<a) return;
    if (l>=a&&r<=b)
    {
        it[id].vmax=max(it[id].vmax,val);
        it[id].val=max(it[id].val,it[id].a+val);
        return;
    }
    down(id);
    int mid=(l+r)/2;
    update(id*2,l,mid,a,b,val);
    update(id*2+1,mid+1,r,a,b,val);
    it[id].val=max(it[id*2].val,it[id*2+1].val);
}
long long query(int id,int l,int r,int a,int b)
{
    if (l>b||r<a) return 0;
    if (l>=a&&r<=b) return it[id].val;
    down(id);
    int mid=(l+r)/2;
    return max(query(id*2,l,mid,a,b),query(id*2+1,mid+1,r,a,b));
}
void prepare()
{
    deque <int> dq;
    for (int i=1;i<=n;i++)
    {
        while (!dq.empty()&&A[dq.back()]<A[i]) dq.pop_back();
        if (!dq.empty()) P.push_back({dq.back(),i});
        dq.push_back(i);
    }
    while (!dq.empty()) dq.pop_back();
    for (int i=n;i>=1;i--)
    {
        while (!dq.empty()&&A[dq.back()]<=A[i]) dq.pop_back();
        if (!dq.empty()) {P.push_back({i,dq.back()});}
        dq.push_back(i);
    }
    sort(P.begin(),P.end(),greater<pp>());
   // for (int i=0;i<P.size();i++)
       // cout<<P[i].first<<' '<<P[i].second<<'\n';
}
void solve()
{
    cin>>n;
    for (int i=1;i<=n;i++)
        cin>>A[i];
    prepare();
    cin>>q;
    for (int i=1;i<=q;i++)
    {
        cin>>Q[i].l>>Q[i].r;
        Q[i].pos=i;
    }
    for (int i=1;i<=4*n;i++) it[i].a=it[i].val=it[i].vmax=0;
    build(1,1,n);
    sort(Q+1,Q+q+1);
    int d=0;
    for (int i=1;i<=q;i++)
    {
        while (d<P.size()&&P[d].first>=Q[i].l)
        {
            int c=2*P[d].second-P[d].first;
            if (c<=n) update(1,1,n,c,n,(long long) A[P[d].first]+A[P[d].second]);
            d++;
        }
        res[Q[i].pos]=query(1,1,n,Q[i].l,Q[i].r);
    }
    for (int i=1;i<=q;i++)
        cout<<res[i]<<'\n';
}
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  //  freopen("jump1000.inp","r",stdin);
  //  freopen("jump1000.out","w",stdout);
    solve();
}
Compilation message (stderr)
jumps.cpp: In function 'void solve()':
jumps.cpp:102:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (d<P.size()&&P[d].first>=Q[i].l)
                ~^~~~~~~~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |