#pragma GCC optimize("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#define lli long long int
#define loop(i,x,n) for(int i=x;i<n;i++)
#define loopr(i,x,n) for(int i=n-1;i>=x;i--)
#define st set<lli>
#define v vector<lli>
#define um unordered_map<lli,lli>
#define vpl vector<pair<lli,lli>>
#define llu long long unsigned
#define ms multiset<int,greater<int>>
#define ums unordered_map<string,lli>
#define pb push_back
#define time ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cout.setf(ios::fixed); cout.setf(ios::showpoint);
#define test lli t; cin>>t; while(t--)
using namespace std;
int gcd(int a,int b)
{
    if(b==0) return a;
    return gcd(b,a%b);
}
v adj[100001];
lli vist[10001];

void dfs(lli node)
{
    vist[node]=1;
    for(lli child : adj[node]) if(!vist[child]) dfs(child);
}

int main()
{
    time
    int n;
    cin>>n;
    multiset<lli> negi;
    lli h = 0;
    lli x;
    int ans=0;
    loop(i,0,n)
    {
        cin>>x;
        if(x>=0) h+=x,ans++;
        else
        {
            if(h+x >=0 ) ans++,h+=x,negi.insert(x);
            else
            {
                lli it = *(negi.begin());
                if(it<x)
                {
                    negi.erase(negi.begin());
                    h-=it;
                    h+=x;
                    negi.insert(x);
                }
            }
        }
    }
    cout<<ans;
    return 0;
}