#include<bits/stdc++.h>
using namespace std;
#define F first
#define S second
typedef long long ll;
void qread(int &x){
int neg=1;x=0;
register char c=getchar();
while(c<'0'||c>'9'){if(c=='-')neg=-1;c=getchar();}
while(c>='0'&&c<='9')x=10*x+c-'0',c=getchar();
x*=neg;
}
void Wl(int x)
{
printf("%d\n",x);
}
ll qs[100005];
map<ll,int> mp;
int dp[100005];
struct Node
{
int val;
Node *l,*r;
void compute()
{
val = max(l->val,r->val);
}
Node(Node *l,Node *r):l(l),r(r){
compute();
}
Node(int val):l(nullptr),r(nullptr),val(val){}
};
Node *build(int l,int r)
{
if(l==r)return new Node(INT_MIN);
int md=(l+r)/2;
return new Node(build(l,md),build(md+1,r));
}
int query(Node *now,int l,int r,int x,int y)
{
if(y<l || x>r)return INT_MIN;
if(x<=l && r<=y)return now->val;
int md=(l+r)/2;
return max(query(now->l,l,md,x,y),query(now->r,md+1,r,x,y));
}
void update(Node *now,int l,int r,int pos,int val)
{
if(l==r)
{
now->val = val;
return;
}
int md=(l+r)/2;
if(pos<=md)update(now->l,l,md,pos,val);
else update(now->r,md+1,r,pos,val);
now->compute();
}
int main()
{
int n, tmp;
qread(n);
for(int i=1;i<=n;i++)
{
qread(tmp);
qs[i]=qs[i-1]+tmp;
mp[qs[i]];
}
int cnt=0;
auto it=mp.begin();
while(it!=mp.end())
{
mp[(*it).F]=++cnt;
it++;
}
Node *root=build(1,n);
for(int i=1;i<=n;i++)
{
int u=query(root,1,n,1,mp[qs[i]]-1);
if(u==INT_MIN)
{
if(qs[i]>0)dp[i]=1;
else if(qs[i]==0)dp[i]=0;
else dp[i]=INT_MIN;
}
else dp[i]=u+1;
update(root,1,n,mp[qs[i]],dp[i]);
}
Wl(dp[n]);
#ifdef TIME
printf("Running Time = %d ms\n",int(clock()*1000.0/CLOCKS_PER_SEC));
#endif
}
/*
*/
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBGIGZpcnN0CiNkZWZpbmUgUyBzZWNvbmQKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnZvaWQgcXJlYWQoaW50ICZ4KXsKCWludCBuZWc9MTt4PTA7CglyZWdpc3RlciBjaGFyIGM9Z2V0Y2hhcigpOwoJd2hpbGUoYzwnMCd8fGM+JzknKXtpZihjPT0nLScpbmVnPS0xO2M9Z2V0Y2hhcigpO30KCXdoaWxlKGM+PScwJyYmYzw9JzknKXg9MTAqeCtjLScwJyxjPWdldGNoYXIoKTsKCXgqPW5lZzsKfQp2b2lkIFdsKGludCB4KQp7CiAgICBwcmludGYoIiVkXG4iLHgpOwp9CmxsIHFzWzEwMDAwNV07Cm1hcDxsbCxpbnQ+IG1wOwppbnQgZHBbMTAwMDA1XTsKc3RydWN0IE5vZGUKewogICAgaW50IHZhbDsKICAgIE5vZGUgKmwsKnI7CiAgICB2b2lkIGNvbXB1dGUoKQogICAgewogICAgICAgIHZhbCA9IG1heChsLT52YWwsci0+dmFsKTsKICAgIH0KICAgIE5vZGUoTm9kZSAqbCxOb2RlICpyKTpsKGwpLHIocil7CiAgICAgICAgY29tcHV0ZSgpOwogICAgfQogICAgTm9kZShpbnQgdmFsKTpsKG51bGxwdHIpLHIobnVsbHB0ciksdmFsKHZhbCl7fQp9OwpOb2RlICpidWlsZChpbnQgbCxpbnQgcikKewogICAgaWYobD09cilyZXR1cm4gbmV3IE5vZGUoSU5UX01JTik7CiAgICBpbnQgbWQ9KGwrcikvMjsKICAgIHJldHVybiBuZXcgTm9kZShidWlsZChsLG1kKSxidWlsZChtZCsxLHIpKTsKfQppbnQgcXVlcnkoTm9kZSAqbm93LGludCBsLGludCByLGludCB4LGludCB5KQp7CiAgICBpZih5PGwgfHwgeD5yKXJldHVybiBJTlRfTUlOOwogICAgaWYoeDw9bCAmJiByPD15KXJldHVybiBub3ctPnZhbDsKICAgIGludCBtZD0obCtyKS8yOwogICAgcmV0dXJuIG1heChxdWVyeShub3ctPmwsbCxtZCx4LHkpLHF1ZXJ5KG5vdy0+cixtZCsxLHIseCx5KSk7Cn0Kdm9pZCB1cGRhdGUoTm9kZSAqbm93LGludCBsLGludCByLGludCBwb3MsaW50IHZhbCkKewogICAgaWYobD09cikKICAgIHsKICAgICAgICBub3ctPnZhbCA9IHZhbDsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgbWQ9KGwrcikvMjsKICAgIGlmKHBvczw9bWQpdXBkYXRlKG5vdy0+bCxsLG1kLHBvcyx2YWwpOwogICAgZWxzZSB1cGRhdGUobm93LT5yLG1kKzEscixwb3MsdmFsKTsKICAgIG5vdy0+Y29tcHV0ZSgpOwp9CmludCBtYWluKCkKewogICAgaW50IG4sIHRtcDsKCXFyZWFkKG4pOwogICAgZm9yKGludCBpPTE7aTw9bjtpKyspCiAgICB7CiAgICAgICAgcXJlYWQodG1wKTsKICAgICAgICBxc1tpXT1xc1tpLTFdK3RtcDsKICAgICAgICBtcFtxc1tpXV07CiAgICB9CiAgICBpbnQgY250PTA7CiAgICBhdXRvIGl0PW1wLmJlZ2luKCk7CiAgICB3aGlsZShpdCE9bXAuZW5kKCkpCiAgICB7CiAgICAgICAgbXBbKCppdCkuRl09KytjbnQ7CiAgICAgICAgaXQrKzsKICAgIH0KICAgIE5vZGUgKnJvb3Q9YnVpbGQoMSxuKTsKICAgIGZvcihpbnQgaT0xO2k8PW47aSsrKQogICAgewogICAgICAgIGludCB1PXF1ZXJ5KHJvb3QsMSxuLDEsbXBbcXNbaV1dLTEpOwogICAgICAgIGlmKHU9PUlOVF9NSU4pCiAgICAgICAgewogICAgICAgICAgICBpZihxc1tpXT4wKWRwW2ldPTE7CiAgICAgICAgICAgIGVsc2UgaWYocXNbaV09PTApZHBbaV09MDsKICAgICAgICAgICAgZWxzZSBkcFtpXT1JTlRfTUlOOwogICAgICAgIH0KICAgICAgICBlbHNlIGRwW2ldPXUrMTsKICAgICAgICB1cGRhdGUocm9vdCwxLG4sbXBbcXNbaV1dLGRwW2ldKTsKICAgIH0KICAgIFdsKGRwW25dKTsKICAgICNpZmRlZiBUSU1FCiAgICAJcHJpbnRmKCJSdW5uaW5nIFRpbWUgPSAlZCBtc1xuIixpbnQoY2xvY2soKSoxMDAwLjAvQ0xPQ0tTX1BFUl9TRUMpKTsKICAgICNlbmRpZgp9Ci8qCgoqLw==