#include <bits/stdc++.h>
#include <cstdio>
using namespace std;
 
#define ll long long
mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
ll rand(ll l, ll r){
    return uniform_int_distribution<ll>(l, r)(rng);
}
const ll mod = 998244353;
const ll INF = 1e18;
const int INT_INF = 2e9;
 
long long binpow(long long base, long long power, long long mod) {
    if (base == 0) return 0;
    if (base == 1) return 1;
    if (power <= 0) return 1;
    long long multiplier = (power % 2 == 0 ? 1 : base) % mod;
    return (multiplier * binpow((base * base) % mod, power / 2, mod)) % mod;
}
ll gcd(ll a, ll b){
    if(b == 0) return a;
    return gcd(b, a % b);
}
ll add(ll a, ll b) {return a + b;}
ll sub(ll a, ll b) {return a - b;}
const int N = 5e5 + 1;
vector<int> adj[N];
int in[N];
int timer = -1;
void dfs(int node, int prev = -1){
    in[node] = ++timer;
    for(int v : adj[node]){
        if(v == prev) continue;
        dfs(v, node);
    }
}
bool sort_by_in(int above, int below){
    return in[above] < in[below];
}
const int LOGN = 19;
ll get_min(vector<vector<ll>>& sparse, int l, int r){
    int len = r - l + 1;
    int lower_log = (int)log2(len);
    int cover_len = (1 << lower_log);
    return min(sparse[r][lower_log], sparse[l + cover_len - 1][lower_log]);
}
void Run(){
    int n; cin >> n;
    n *= 2;
    vector<int> arr(n + 1);
    vector<ll> pref(n + 1);
    for(int i = 1; i <= n/2; i++){
        cin >> arr[i];
        arr[i + n/2] = arr[i];
    }
    for(int i = 1; i <= n; i++){
        pref[i] = (pref[i - 1] + arr[i]);
    }
    int taken = (n/2 + 1) / 2;
    vector<ll> sum(n + 1);
    for(int i = 1; i <= n; i++){
        if(i <= taken) sum[i] = pref[i];
        else sum[i] = pref[i] - pref[i - taken];
    }
    
    vector<vector<ll>> sparse(n + 1, vector<ll>(LOGN, 0)); // Stores min
    for(int i = 1; i <= n; i++) {
        sparse[i][0] = sum[i];
        for(int lift = 1; lift < LOGN; lift++){
            int half_length = (1 << (lift - 1));
            sparse[i][lift] = min(sparse[i][lift - 1], sparse[max(i - half_length, 1)][lift - 1]);
        }
    }
    
    ll all_mx = 0;
    for(int i = 1; i <= n; i++){
        // Finding min of all subarrs length = taken, containing i.
        int r = min(n, i + taken - 1);
        int l = max(i, taken);
        all_mx = max(all_mx, get_min(sparse, l, r));
    }
    cout << all_mx << "\n";
}
int main(){
    //freopen("CIRSSTR.INP", "r", stdin);
    //freopen("CIRSSTR.OUT", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);
    
    int test = 1;
    //cin >> test;
    // Measuring running time (breaks when manual input)
    //auto time_start = clock();
    while(test--) Run();
    //auto time_end = clock();
    //cerr << "Time taken: " << time_end - time_start << "\n";
}
| # | 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... |