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... |