#include <bits/stdc++.h>
using namespace std;
#define int long long
int n;
int l[500004], r[500004], val[500004];
int sums[500004];
int become = 0;
void build(int now){
    if(now < n){
        build(now * 2);
        build(now * 2 + 1);
        l[now] = l[now * 2];
        r[now] = r[now * 2 + 1];
        val[now] = min(val[now * 2], val[now * 2 + 1]);
    }   
    else{
        l[now] = become;
        r[now] = become;
        val[now] = sums[become++];
    }
}
int query(int left, int right, int now){
    if(right < l[now] || r[now] < left){
        return INT_MAX;
    }
    else if(left <= l[now] && right >= r[now]){
        return val[now];
    }
    else{
        return(min(query(left, right, now * 2), query(left, right, now * 2 + 1)));
    }
}
signed main(){
    int left, right;
    cin >> n;
    vector<int>numere;
    
    int sum = 0, half = (n + 1) / 2, add;
    
    for(int i = 0; i < n; i++){
        cin >> add;
        numere.push_back(add);
        if(i < half){
            sum+= add;
        }
    }
    
    for(int i = 0; i < n; i++){
        sums[i%n] = sum;
        
        sum -= numere[(i + half)%n];
        sum += numere[i%n];
    }
    
    build(1);
    
    int ans = -1;
    
    for(int i = 0; i < n; i++){
        left = (i - half + 1) % n;
        right = i;
        if(right < left){
            ans = max(ans, min(query(0, right, 1), query(left, n - 1, 1)));
        }
        else{
            ans = max(ans, query(left, right, 1));
        }
    }
    
    cout << ans;
}
| # | 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... |