#include<bits/stdc++.h>
#define int long long
using namespace std;
int T;
int n,a[2000005],ans,cnt;
long long pre[2000005];
struct node{
	long long s,lazy;
}t[4000005];
struct Node{
	int p,x;
}b[2000005];
bool cmp(Node u,Node v){
	if(u.x==v.x)return u.p>v.p;
	return u.x>v.x;
}
void push_up(int p){
	t[p].s=min(t[p<<1].s,t[p<<1|1].s);
}
void build(int l,int r,int p){
	if(l==r){
		t[p].s=pre[l];
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,p<<1);
	build(mid+1,r,p<<1|1);
	push_up(p);
}
void push_down(int p){
	t[p<<1].lazy+=t[p].lazy;
	t[p<<1|1].lazy+=t[p].lazy;
	t[p<<1].s+=t[p].lazy;
	t[p<<1|1].s+=t[p].lazy;
	t[p].lazy=0;
}
int query(int l,int r,int p,int l1,int r1){
	if(l>=l1&&r<=r1)return t[p].s;
	int mid=(l+r)>>1,ans=1e18;
	push_down(p);
	if(mid>=l1)ans=min(ans,query(l,mid,p<<1,l1,r1));
	if(r1>mid)ans=min(ans,query(mid+1,r,p<<1|1,l1,r1));
	return ans;
}
void update(int l,int r,int p,int l1,int r1,int k){
	if(l>=l1&&r<=r1){
		t[p].s+=k;
		t[p].lazy+=k;
		return;
	}
	int mid=(l+r)>>1;
	push_down(p);
	if(mid>=l1)update(l,mid,p<<1,l1,r1,k);
	if(r1>mid)update(mid+1,r,p<<1|1,l1,r1,k);
	push_up(p);
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(a[i]>=0)pre[i]=pre[i-1]+a[i],ans++;
		else pre[i]=pre[i-1],b[++cnt].p=i,b[cnt].x=a[i];
	}
	sort(b+1,b+cnt+1,cmp);
	build(1,n,1);
	for(int i=1;i<=cnt;i++)
		if(query(1,n,1,b[i].p,n)+b[i].x>=0){
		//	cout<<b[i].p<<' '<<query(1,n,1,b[i].p,n)<<endl;
			ans++,update(1,n,1,b[i].p,n,b[i].x);

		}
	cout<<ans<<endl;
}