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;
const int maxn = 5e5 + 4;
const int maxm = 5e3 + 4;
int a[maxn] , n , m , dp[maxm][maxm] , ma[maxm][maxm];
int l[maxn] , r[maxn];
void nhap()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for (int i = 1 ; i <= n ; i ++)
        cin >> a[i];
    cin >> m;
    for (int i = 1 ; i <= m ; i ++)
        cin >> l[i] >> r[i];
}
void xl1(int l , int r)
{
    int ans = 0;
    for (int i = l ; i <= r - 2 ; i ++)
    {
        for (int j = i + 1 ; j <= r - 1 ; j ++)
        {
            for (int k = j + (j - i) ; k <= r ; k ++)
            {
                ans = max(ans , a[i] + a[j] + a[k]);
            }
        }
    }
    cout << ans << '\n';
}
void Sub1()
{
    for (int i = 1 ; i <= m ; i ++)
    {
        xl1(l[i] , r[i]);
    }
}
void Sub2()
{
    for (int i = 1 ; i <= n ; i ++)
        ma[i][i] = a[i];
    for (int i = 1 ; i < n ; i ++)
        for (int j = i + 1 ; j <= n ; j ++)
        {
            ma[i][j] = max(ma[i][j - 1] , a[j]);
        }
    for (int i = 2 ; i < n ; i ++)
    {
        for (int j = 1 ; j <= n - i ; j ++)
        {
            int l = j;
            int r = j + i;
            dp[l][r] = max(dp[l][r - 1] , max(dp[l + 1][r] , a[l] + a[r] + ma[l + 1][(l + r) / 2]));
        }
    }
    for (int i = 1 ; i <= m ; i ++)
    {
        cout << dp[l[i]][r[i]] << '\n';
    }
}
signed main()
{
    nhap();
    if (n <= 100 && m <= 100)
        Sub1();
    else
        if (n <= 5000)
        Sub2();
}
| # | 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... |