#include<bits/stdc++.h>
#define MAXN 500007
using namespace std;
const int inf=1e9;
struct tower{
int val,pos;
inline friend bool operator < (tower a,tower b){
return a.val>b.val;
}
};
int n,ans,q,l,r;
tower a[MAXN];
int maxs[MAXN][20];
int lg[MAXN];
int dp[5007][5007];
void calc(){
for(int j=1;j<20;j++){
for(int i=1;i+(1<<j)-1<=n;i++){
maxs[i][j]=max( maxs[i][j-1] , maxs[i+(1<<(j-1))][j-1] );
}
}
for(int i=2;i<=n;i++)lg[i]=lg[i/2]+1;
}
int getmax(int l,int r){
if(l>r)return -inf;
int len=r-l+1;
return max( maxs[l][lg[len]] , maxs[r-(1<<lg[len])+1][lg[len]] );
}
void solve_fast(){
sort(a+1,a+n+1);
for(int i=1;i<=min(n,20);i++){
for(int f=1;f<=n;f++){
if(i==f)continue;
int c=a[i].pos,d=a[f].pos;
if(c>d)swap(c,d);
ans=max(ans,a[i].val + a[f].val + getmax(c+1,(c+d)/2));
ans=max(ans,a[i].val + a[f].val + getmax(max(c-(d-c),1),c-1));
ans=max(ans,a[i].val + a[f].val + getmax(d+(d-c),n));
}
}
cout<<ans<<"\n";
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].val;
a[i].pos=i;
maxs[i][0]=a[i].val;
}
calc();
if(n>5000){
solve_fast();
return 0;
}
for(int len=3;len<=n;len++){
for(int i=1;i+len-1<=n;i++){
int f=i+len-1;
if(i+2==f)dp[i][f]=a[i].val+a[i+1].val+a[i+2].val;
else{
dp[i][f]=max(dp[i][f-1],dp[i+1][f]);
dp[i][f]=max(dp[i][f],a[i].val+a[f].val+getmax(i+1,(i+f)/2));
}
}
}
cin>>q;
for(int i=1;i<=q;i++){
cin>>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... |