/*
これを入れて実行
g++ code.cpp
./a.out
 */
 
#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
#include <cstring>
#include <queue>
#include <deque>
#include <stack>
#include <algorithm>
#include <utility>
#include <set>
#include <map>
#include <unordered_map>
#include <cmath>
#include <math.h>
#include <tuple>
#include <iomanip>
#include <bitset>
#include <functional>
#include <cassert>

#define all(x) (x).begin(),(x).end()
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
 
using namespace std;
typedef long long ll;
typedef long double ld;
 
int dy4[4] = {-1, 0, +1, 0};
int dx4[4] = {0, +1, 0, -1};
int dy8[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dx8[8] = {0, 1, 1, 1, 0, -1, -1, -1};
 
const long long INF = 1LL << 60;
const ll MOD = 1e9 + 7;
 
bool greaterSecond(const pair<int, int>& f, const pair<int, int>& s){
    return f.second > s.second;
}
 
ll gcd(ll a, ll b){
	if (b == 0)return a;
	return gcd(b, a % b);
}
 
ll lcm(ll a, ll b){
    return a / gcd(a, b) * b;
}

ll conbinationMemo[100][100];

void cmemoInit(){
    rep(i, 100){
        rep(j, 100){
            conbinationMemo[i][j] = -1;
        }
    }
}
 
ll nCr(ll n, ll r){
    if(conbinationMemo[n][r] != -1) return conbinationMemo[n][r];
    if(r == 0 || r == n){
        return 1;
    } else if(r == 1){
        return n;
    }
    return conbinationMemo[n][r] = (nCr(n - 1, r) + nCr(n - 1, r - 1));
}
 
ll nPr(ll n, ll r){
    r = n - r;
    ll ret = 1;
    for (ll i = n; i >= r + 1; i--) ret *= i;
    return ret;
}
//-----------------------ここから-----------
int main(void){
    ll n;
    cin >> n;
    vector<ll> a(n);
    rep(i, n) cin >> a[i];

    vector<ll> sumL(n + 1, 0), sumR(n + 1, 0);
    rep(i, n){
        sumL[i + 1] = sumL[i] + a[i];
    }

    for(ll i = n; i > 0; i--){
        sumR[i - 1] = sumR[i] + a[i - 1];
    }

    reverse(all(sumR));

    ll ans = INF;

    for(ll i = 1; i < n - 2; i++){
        ll aveL = sumL[i + 1] / 2;
        auto itrL = lower_bound(all(sumL), aveL);
        ll aveR = sumR[n - i - 1] / 2;
        auto itrR = lower_bound(all(sumR), aveR);
        vector<ll> tmp;
        tmp.push_back(*itrL);
        tmp.push_back(sumL[i + 1] - *itrL);
        tmp.push_back(*itrR);
        tmp.push_back(sumR[n - i - 1] - *itrR);
        ll ma = -INF;
        ll mi = INF;
        rep(j, tmp.size()){
            ma = max(ma, tmp[j]);
            mi = min(mi, tmp[j]);
        }
        ans = min(ans, abs(ma - mi));

        tmp.clear();
        ma = -INF;
        mi = INF;
        auto itrL2 = lower_bound(all(sumL), aveL);
        auto itrR2 = lower_bound(all(sumR), aveR);   
        itrL2--;
        itrR2--;     
        tmp.push_back(*itrL2);
        tmp.push_back(sumL[i + 1] - *itrL2);
        tmp.push_back(*itrR2);
        tmp.push_back(sumR[n - i - 1] - *itrR2);
        rep(j, tmp.size()){
            ma = max(ma, tmp[j]);
            mi = min(mi, tmp[j]);
        }
        ans = min(ans, abs(ma - mi));

        tmp.clear();
        ma = -INF;
        mi = INF;
        tmp.push_back(*itrL);
        tmp.push_back(sumL[i + 1] - *itrL);
        tmp.push_back(*itrR2);
        tmp.push_back(sumR[n - i - 1] - *itrR2);
        rep(j, tmp.size()){
            ma = max(ma, tmp[j]);
            mi = min(mi, tmp[j]);
        }
        ans = min(ans, abs(ma - mi));

        tmp.clear();
        ma = -INF;
        mi = INF;
        tmp.push_back(*itrL2);
        tmp.push_back(sumL[i + 1] - *itrL2);
        tmp.push_back(*itrR);
        tmp.push_back(sumR[n - i - 1] - *itrR);
        rep(j, tmp.size()){
            ma = max(ma, tmp[j]);
            mi = min(mi, tmp[j]);
        }
        ans = min(ans, abs(ma - mi));

    }
    cout << ans << endl;
}


Measured memory_bytes: 7992