/*__stO_stO_stO_stO_stO_stO_stO_zit_Orz_Orz_Orz_Orz_Orz_Orz_Orz__*/
#include<bits/stdc++.h>
using namespace std;
#define name "zit"
using ll=long long;const ll MOD2=998244353;
#define all(x,y) x.begin()+1, x.begin()+y+1
#define FOR(i,a,b) for(ll i=(a);i<=(b);++i)
using vl=vector<ll>; using pll=pair<ll,ll>;
const int maxn=5e5+1, MOD=1e9+7;// __ c:|
#define pb push_back// zit#6421 <(o )____|
const long long INF = 2e18;ll n;//( ._> /|
#define All(x) x.begin(),x.end()/* `----'*/
#define stop assert(0||!(cerr<<"\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"));
#define ok cerr << "if u see this line , then ur code worked orz\n"
#define debug(x) cerr<<#x<<" = "<<x<<'\n'
#define el cerr<<'\n'
#define irl ll id, ll l, ll r
struct Node {
ll k, j;
Node (ll k = 0, ll j = 0) : k (k), j (j) {}
bool operator< (const Node & a) const {
if (k < a.k) return 1;
if (k > a.k) return 0;
return j < a.j;
}
};
Node operator + (Node & a, Node & b) {
return max (a, b);
}
struct Seg {
ll n; vector<Node> st, lazy;
void build (irl, vector <pll> & a) {
if (l == r) {st[id] = {a[l].first, a[l].second};return;}
ll mid = l + r >> 1;
build(id<<1,l,mid,a); build(id<<1|1,mid+1,r,a);
st[id] = st[id<<1] + st[id<<1|1];
} Seg (ll n, vector <pll> & a) : n(n) {st.resize(4 * n + 1); lazy.resize (4 * n + 1); build (1,1,n,a);}
void down (irl) {
Node val = lazy[id];
lazy[id] = {0, 0};
for (auto & c : {id << 1, id << 1 | 1}) {
st[c] = max (st[c], val);
lazy[c] = max (lazy[c], val);
}
}
void upd_range (irl, ll u, ll v, Node val) {
if (l > v || r < u) return;
if (u <= l && r <= v) {
st[id] = max (st[id], val);
lazy[id] = max (lazy[id], val);
return;
} ll mid = l + r >> 1; down (id, l, r);
upd_range (id << 1, l, mid, u, v, val);
upd_range (id << 1 | 1, mid + 1, r, u, v, val);
st[id] = st[id << 1] + st[id << 1 | 1];
} void upd_range (ll u, ll v, Node val) {upd_range (1,1,n,u,v,val);}
Node get (irl, ll u, ll v) {
if (l > v || r < u) return {0, 0};
if (u <= l && r <= v) return st[id];
ll mid = l + r >> 1; down (id, l, r);
Node get1 = get (id<<1, l, mid, u, v);
Node get2 = get (id<<1|1, mid + 1, r, u, v);
return get1 + get2;
} Node get (ll u, ll v) {return get(1,1,n,u,v);}
};
void sibidi () { cin >> n;
vl a (n + 1), pre (n + 1, 0);
FOR (i,1,n) cin >> a[i];
// reverse (all (a, n));
FOR (i,1,n) pre[i] = pre[i - 1] + a[i];
vector <pll> dp (n + 1, {0, 0});
Seg seg (n, dp);
FOR (i,0,n) {
Node val_dp = seg.get (i, i);;
auto it = lower_bound (All (pre), 2 * pre[i] - pre[val_dp.j]);
if (it == pre.end ()) continue;
ll nxt = it - pre.begin ();
// cm dc nxt nam sau i
seg.upd_range (nxt, n, Node (val_dp.k + 1, i));
}
cout << seg.get (n, n).k;
} signed main() {
if(fopen(name".inp","r"))
{freopen(name".inp","r",stdin);freopen(name".out","w",stdout);}
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);ll _=1;
//cin>>_;
while(_--)sibidi();return 0;}