// template version 1.7

// varibable settings {{{
using namespace std;
#include <iostream>
#include <bits/stdc++.h>

#define int long long
#define INF 1e18
// #define INF 2147483647
#define MOD 1e9+7
#define infile "../test/sample-1.in"
int dx[]={1, -1, 0, 0};
int dy[]={0, 0, 1, -1};
#define fi first
#define se second

// }}}

// define basic macro {{{
#define _overload3(_1,_2,_3,name,...) name
#define _rep(i,n) repi(i,0,n)
#define repi(i,a,b) for(int i=(int)(a);i<(int)(b);++i)
#define rep(...) _overload3(__VA_ARGS__,repi,_rep,)(__VA_ARGS__)
#define _rrep(i,n) rrepi(i,0,n)
#define rrepi(i,a,b) for(int i=(int)(b-1);i>=(int)(a);--i)
#define rrep(...) _overload3(__VA_ARGS__,rrepi,_rrep,)(__VA_ARGS__)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define uni(x) sort(all(x));x.erase(unique(all(x)),x.end())
template<class T> inline void chmax(T &a, const T &b) { if(a < b) a = b; }
template<class T> inline void chmin(T &a, const T &b) { if(a > b) a = b; }

typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef long double ld;
typedef pair<int,int> pii;
typedef tuple<int,int,int> iii;
template<typename T> using PQ = priority_queue<T, vector<T>, greater<T>>;

// dump macro
#ifdef PCM
  #include "dump.hpp"
#else
  #define dump(...) 42
  #define dump_1d(...) 42
  #define dump_2d(...) 42
#endif
struct Fast { Fast(){ std::cin.tie(0); ios::sync_with_stdio(false); } } fast;
// }}}

// acumulative sum vector {{{
template<typename T=int>
struct asvector : public vector<T> {
  using vector<T>::vector;
  vector<T> cum; //accumulative sum
  bool is_accumulated = false;

  public:
  T rsum(int l, int r) {  // return sum of [l, r] of data.
    if (!is_accumulated)
      _accumulate();
    l = std::max(0LL, l);
    r = std::min(r, sz(cum)-1);
    return _calc_rangesum(l, r);
  }

  void _accumulate(){
    cum = vector<T>(*this);
    for(T i=1; i<sz(cum); i++){
      cum[i] = cum[i-1] + (*this)[i];
    }
    is_accumulated = true;
  }

  void push_back(T x){
    (*this).emplace_back(x);
    is_accumulated = false;
  }

  private:
  T _calc_rangesum(int l, int r) {
    if (l > r)
      return 0;
    else
      return cum[r] - (l-1>=0 ? cum[l-1] : 0);
  }
};
using asvi = asvector<int>;
//}}}

int solve(){
  int n;cin>>n;
  asvi a;
  rep(i, n){
    int tmp;cin>>tmp;
    a.pb(tmp);
  }

  int res=INF;
  rep(i, 2, n-1){
    int s,t,u,v;
    int m,M;
    m=INF;M=0;
    {
      int left = -1;
      int right = i-1;
      while (right-left>1){
        int mid = (right+left)/2;
        if (a.rsum(0, mid)>=a.rsum(mid+1, i-1)) { right = mid;}
        else{ left = mid; }
      }
      dump(i, right);
      int p = abs(a.rsum(0, right)-a.rsum(right+1, i-1));
      int q = abs(a.rsum(0, right-1)-a.rsum(right, i-1));
      if (p<q) {
        s = a.rsum(0, right);
        t = a.rsum(right+1, i-1);
      }
      else{
        s = a.rsum(0, right-1);
        t = a.rsum(right, i-1);
      }
      dump(s, t);
      chmin(m, s);
      chmin(m, t);
      chmax(M, s);
      chmax(M, t);
    }
    {
      int left = i-1;
      int right = n-1;
      while (right-left>1){
        int mid = (right+left)/2;
        if (a.rsum(i, mid)>=a.rsum(mid+1, n-1)) { right = mid;}
        else{ left = mid; }
      }
      dump(i, right);
      int p = abs(a.rsum(i, right)-a.rsum(right+1, n-1));
      int q = abs(a.rsum(i, right-1)-a.rsum(right, n-1));
      if (p<q) {
        u = a.rsum(i, right);
        v = a.rsum(right+1, n-1);
      }
      else{
        u = a.rsum(i, right-1);
        v = a.rsum(right, n-1);
      }
      dump(u, v);
      chmin(m, u);
      chmin(m, v);
      chmax(M, u);
      chmax(M, v);
    }
    dump(M-m);
    chmin(res, M-m);
  }
  cout << res << endl;
  
  return 0;
}

signed main() { //{{{
#ifdef INPUT_FROM_FILE
  std::ifstream in(infile);
  std::cin.rdbuf(in.rdbuf());
#endif
  solve();
  return 0;
} //}}}


Measured memory_bytes: 3568