// Slower C++ solution:
#include <cstdio>

#include <cstring>

#include <algorithm>

using namespace std;

const int maxn=2e5+100;

typedef long long LL;

int n;

LL a[maxn],p[5];



int main(int argc, char const *argv[])

{

    while (scanf("%d",&n)!=EOF)

    {

        memset(a,0,sizeof(a));

        for (int i=1;i<=n;i++)

        {

            scanf("%lld",&a[i]);

            a[i]+=a[i-1];

        }



        LL ans=3e14;

        for (int i=2;i<=n-1;i++)

        {

            int x=lower_bound(a+1,a+i+1,a[i]/2)-a;

            int y=lower_bound(a+1,a+n+1,a[i]+(a[n]-a[i])/2)-a;

            if (x!=1) x--;

            if (y!=i+1) y--;



            p[0]=a[x];

            p[1]=a[i]-a[x];

            p[2]=a[y]-a[i];

            p[3]=a[n]-a[y];

            ans=min(ans,abs(max(p[0],max(p[1],max(p[2],p[3])))-min(p[0],min(p[1],min(p[2],p[3])))));



            int x1=x+1,y1=y;

            p[0]=a[x1];

            p[1]=a[i]-a[x1];

            p[2]=a[y1]-a[i];

            p[3]=a[n]-a[y1];

            ans=min(ans,abs(max(p[0],max(p[1],max(p[2],p[3])))-min(p[0],min(p[1],min(p[2],p[3])))));



            int x2=x,y2=y+1;

            p[0]=a[x2];

            p[1]=a[i]-a[x2];

            p[2]=a[y2]-a[i];

            p[3]=a[n]-a[y2];

            ans=min(ans,abs(max(p[0],max(p[1],max(p[2],p[3])))-min(p[0],min(p[1],min(p[2],p[3])))));



            int x3=x+1,y3=y+1;

            p[0]=a[x3];

            p[1]=a[i]-a[x3];

            p[2]=a[y3]-a[i];

            p[3]=a[n]-a[y3];

            ans=min(ans,abs(max(p[0],max(p[1],max(p[2],p[3])))-min(p[0],min(p[1],min(p[2],p[3])))));

        }

        printf("%lld\n", ans);

    }

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.7706272472852997x):
/*بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيم*/

#include <bits/stdc++.h>

using namespace std;

#define FASTIO ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);

typedef long long ll;

const double PI = acos(-1.0);

const ll mod = 1e9 + 7;



inline void normal(ll &a) { a %= mod; (a < 0) && (a += mod); }

inline ll modMul(ll a, ll b) { a %= mod, b %= mod; normal(a), normal(b); return (a * b) % mod; }

inline ll modAdd(ll a, ll b) { a %= mod, b %= mod; normal(a), normal(b); return (a + b) % mod; }

inline ll modSub(ll a, ll b) { a %= mod, b %= mod; normal(a), normal(b); a -= b; normal(a); return a; }

inline ll modPow(ll b, ll p) { ll r = 1; while (p) { if (p & 1) r = modMul(r, b); b = modMul(b, b); p >>= 1; } return r; }

inline ll modInverse(ll a) { return modPow(a, mod - 2); }

inline ll modDiv(ll a, ll b) { return modMul(a, modInverse(b)); }





/* for Random Number generate

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

*/

///**

template < typename F, typename S >

ostream& operator << ( ostream& os, const pair< F, S > & p ) {

  return os << "(" << p.first << ", " << p.second << ")";

}



template < typename T >

ostream &operator << ( ostream & os, const vector< T > &v ) {

  os << "{";

  for (auto it = v.begin(); it != v.end(); ++it) {

    if ( it != v.begin() ) os << ", ";

    os << *it;

  }

  return os << "}";

}



template < typename T >

ostream &operator << ( ostream & os, const set< T > &v ) {

  os << "[";

  for (auto it = v.begin(); it != v.end(); ++it) {

    if ( it != v.begin()) os << ", ";

    os << *it;

  }

  return os << "]";

}



template < typename F, typename S >

ostream &operator << ( ostream & os, const map< F, S > &v ) {

  os << "[";

  for (auto it = v.begin(); it != v.end(); ++it) {

    if ( it != v.begin() ) os << ", ";

    os << it -> first << " = " << it -> second ;

  }

  return os << "]";

}



#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)



clock_t tStart = clock();

#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)



void faltu () { cerr << endl; }



template <typename T>

void faltu( T a[], int n ) {

  for (int i = 0; i < n; ++i) cerr << a[i] << ' ';

  cerr << endl;

}



template <typename T, typename ... hello>

void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

// Program showing a policy-based data structure.

#include <ext/pb_ds/assoc_container.hpp> // Common file 

#include <ext/pb_ds/tree_policy.hpp>

#include <functional> // for less 

#include <iostream>

using namespace __gnu_pbds;

using namespace std;

// GNU link : https://goo.gl/WVDL6g

typedef tree<int, null_type, less_equal<int>, rb_tree_tag,

        tree_order_statistics_node_update>

        new_data_set;



// find_by_order(k) – ফাংশনটি kth ordered element এর একটা পয়েন্টার রিটার্ন করে। অর্থাৎ তুমি চাইলেই kth ইন্ডেক্সে কি আছে, সেটা জেনে ফেলতে পারছো!

// order_of_key(x) – ফাংশনটি x এলিমেন্টটা কোন পজিশনে আছে সেটা বলে দেয়।



//*//**___________________________________________________**/



const int N = 2e5 + 10;

ll a[N];



int main()

{

  FASTIO

  /*

#ifndef ONLINE_JUDGE

  freopen("in.txt", "r", stdin);

  freopen("out.txt", "w", stdout);

  freopen("error.txt", "w", stderr);

#endif

//*/

  ll n;

  cin >> n;



  for (int i = 1; i <= n; i++) {

    cin >> a[i];

  }

  ll P = a[1];

  ll Q = 0;

  ll R = a[2] + a[3];

  ll S = 0;

  for (int i = 4; i <= n; i++) S += a[i];



  int l = 1, r = 3;



  ll ans = 2e17;

  for (int i = 2; i <= n - 2; i++) {

    Q += a[i];

    R -= a[i];

    while (l + 1 < i && min(P, Q) < min(P + a[l + 1], Q - a[l + 1])) {

      P += a[l + 1];

      Q -= a[l + 1];

      l++;

    }



    while (r + 1 < n && min(R, S) < min(R + a[r + 1], S - a[r + 1])) {

      R += a[r + 1];

      S -= a[r + 1];

      r++;

    }

    ll mn = min(min(P, Q), min(R, S));

    ll mx = max(max(P, Q), max(R, S));

    ans = min(ans, mx - mn);

  }

  cout << ans << endl;

}