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>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;  
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
typedef string st;
typedef bool bl;
typedef vector<ll> vii;
typedef pair<ll,ll> pii;
typedef vector<pii> vpi;
#define pu push
#define ordered_set tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update>
#define fast ios_base::sync_with_stdio(0);cin.tie();
#define test ll qqqqq;cin>>qqqqq;while(qqqqq--)
#define F first
#define S second
#define forn(i,n) for(ll i=0;i<n;i++)
#define forx(i,j,n) for(ll i=j;i<n;i++)
#define pb push_back
#define pob pop_back
#define all(v) v.begin(),v.end()  
#define lb lower_bound
#define ub upper_bound
#define pof pop_front
#define pow powww
#define prtll(x) printf("%lld",x)
#define prtld(x) printf("%Lf",x)
#define prtst(x) printf("%s",x)
#define prtch(x) printf("%c",x)
#define measure chrono::high_resolution_clock::now()
const ll dx[]{1,0,-1,0};
const ll dy[]{0,-1,0,1};
const ll inf=2e18;
//const ll mod=1e9+7;
const ll LM=1e7+2;
const ll M=3e5+10;
const ll MM=5002;
const ll MMM=101;
const ld pi=acos(-1);
const ll mod=998244353;
ll pow(ll r,ll to,ll m=mod){
  ll res=1;
  while(to){
    if((to&1))
    res*=r,res%=m;
    r*=r,r%=m;
    to=(to>>1);
  } 
  return res;
}
struct seg{
  ll sz=1;
  vii mx;
  void init(ll x){
    while(sz<x)
    sz=(sz<<1);
    mx.resize((sz<<1));
  }
  void update(ll i,ll v,ll x,ll lx,ll rx){
    if(rx-lx==1){
      mx[x]=v;
      return;
    }
    ll mid=((lx+rx)>>1);
    if(i<mid)
    update(i,v,x*2+1,lx,mid);
    else
    update(i,v,x*2+2,mid,rx);
    mx[x]=max(mx[x*2+1],mx[x*2+2]);
  }
  ll query(ll l,ll r,ll x,ll lx,ll rx){
    if(rx<=r&&lx>=l)
    return mx[x];
    else if(rx<=l||lx>=r)
    return 0;
    else{
    ll mid=((lx+rx)>>1);
    return max(query(l,r,x*2+1,lx,mid),query(l,r,x*2+2,mid,rx));
    }
  }
};
ll n,a[M],dp[MM][MM];
seg s;
ll DP(ll l,ll r){
  if(r-l<=1)
  return 0;
  if(dp[l][r]>0)
  return dp[l][r];
  dp[l][r]=max(DP(l+1,r),DP(l,r-1));
  dp[l][r]=max(dp[l][r],a[l]+a[r]+s.query(l+1,((l+r+2)>>1),0,0,s.sz));
  return dp[l][r];
}
int main(){
  cin>>n;
  s.init(n);
  forn(i,n)
  cin>>a[i],s.update(i,a[i],0,0,s.sz);
  test{
    ll l,r;
    cin>>l>>r;
    l--,r--;
    cout<<DP(l,r)<<'\n';
  }
  return 0; 
}
/*
*/
| # | 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... |