// R SAI KRISHNA
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<stack>
#include<unordered_set>
#include<cmath>
#include<numeric>
#include<iterator>
#include<set>
#include<unordered_map>
#include<map>
#include<queue>
#include<cstring>
#include<stdio.h>
#include<fstream>
#include<iomanip>
#include<functional>
#include<bitset>
#include<chrono>
#include<climits>
#include<assert.h>
#include<random>
#include<complex>
// #include<ext/pb_ds/assoc_container.hpp>
// #include<ext/pb_ds/tree_policy.hpp>
#define for0(i, n) for (int i = 0; i < (ll)(n); ++i)
#define for1(i, n) for (int i = 1; i <= (ll)(n); ++i)
#define forc(i, l, r) for (int i = (ll)(l); i <= (ll)(r); ++i)
#define forr0(i, n) for (int i = (ll)(n) - 1; i >= 0; --i)
#define forr1(i, n) for (int i = (ll)(n); i >= 1; --i)
#define pb push_back
#define fi first
#define debug(x) cout << #x << " -> " << x << endl;
#define endl '\n'
#define se second
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin, (x).rend()
#define tr(c,i) for(__typeof__((c)).begin() i = (c).begin(); i != (c).end(); i++)
#define present(c,x) ((c).find(x) != (c).end())
#define cpresent(c,x) (find(all(c),x) != (c).end())
#define sz(a) ll((a).size())
#define mod 1000000007
#define INF LLONG_MAX
using namespace std;
//using namespace __gnu_pbds;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef long long ll;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef double ld;
//typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
void debug_vec(vector<ll>&v){
cout << '[';
for(auto i:v)cout << i << ", "; cout << "]";
cout << "\n";
}
void debug_set(set<ll>&st){
cout << "{";
for(auto i:st)cout << i << ", ";
cout << "}";
cout << "\n";
}
void fast()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
bool prime[1000001];
void sieve()
{
memset(prime, true, sizeof(prime));
prime[1]=false;
for (int p=2; p*p<=1000000; p++)
{
if (prime[p] == true)
{
for (int i=p*p; i<=1000000; i += p)
prime[i] = false;
}
}
}
void print(bool f){
if(f)cout << "YES\n";
else cout << "NO\n";
}
void google(int x){
cout << "Case #" << x << ": " ;
}
ll binary_expo(ll a,ll b){
ll res = 1;
while(b != 0){
if(b&1){
res = (res * a) % mod;
}
b >>= 1;
a = (a*a)%mod;
}
return res;
}
void solve()
{
ll n;
cin >> n;
ll a[n];
ll total = 0;
for(int i=0;i<n;i++){
cin >> a[i];
total += (a[i] != 0)?1:0;
}
vector<pair<ll,ll>>v;
map<ll,vll>mp;
ll start = 0;
mp[0ll].pb(0ll);
ll pre[n];
for(int i=0;i<n;i++){
pre[i] = a[i];
if(i >= 1)pre[i] += pre[i-1];
}
bool f = false;
for(int i=0;i<n;i++){
if(sz(mp[pre[i]]) == 1){
f = true;
ll start_seg = *mp[pre[i]].begin();
ll end_seg = i + 1;
total += max(((end_seg - start_seg)*(end_seg - start_seg - 1))/2 - 1,0ll);
total += max(0ll,((start_seg - start)*(start_seg - start - 1))/2);
start = *mp[pre[i]].begin() + 1;
ll res = *mp[pre[i]].begin() + 1;
v.pb({res,end_seg});
mp.clear();
if(res <= n)
mp[pre[res - 1]].pb(res);
}
else {
mp[pre[i]].pb(i + 1);
}
}
debug(total);debug(start);
if(start <= n)
total += max(0ll,((n - start)*(n - start - 1))/2);
for(auto i : v){
total -= max(0ll,((i.second - i.first)*(i.second - i.first - 1))/2);
}
cout << total << endl;
}
int main()
{
fast();
/*ll t;
cin >> t;
for(int tt = 1;tt <= t ;tt++)*/
solve();
return 0;
}
Ly8gUiBTQUkgS1JJU0hOQSAKI2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8c3RyaW5nPgojaW5jbHVkZTxhbGdvcml0aG0+CiNpbmNsdWRlPHN0YWNrPgojaW5jbHVkZTx1bm9yZGVyZWRfc2V0PgojaW5jbHVkZTxjbWF0aD4KI2luY2x1ZGU8bnVtZXJpYz4KI2luY2x1ZGU8aXRlcmF0b3I+CiNpbmNsdWRlPHNldD4KI2luY2x1ZGU8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGU8bWFwPgojaW5jbHVkZTxxdWV1ZT4KI2luY2x1ZGU8Y3N0cmluZz4KI2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8ZnN0cmVhbT4KI2luY2x1ZGU8aW9tYW5pcD4KI2luY2x1ZGU8ZnVuY3Rpb25hbD4KI2luY2x1ZGU8Yml0c2V0PgojaW5jbHVkZTxjaHJvbm8+CiNpbmNsdWRlPGNsaW1pdHM+CiNpbmNsdWRlPGFzc2VydC5oPgojaW5jbHVkZTxyYW5kb20+CiNpbmNsdWRlPGNvbXBsZXg+Ci8vICNpbmNsdWRlPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgovLyAjaW5jbHVkZTxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgojZGVmaW5lIGZvcjAoaSwgbikgZm9yIChpbnQgaSA9IDA7IGkgPCAobGwpKG4pOyArK2kpCiNkZWZpbmUgZm9yMShpLCBuKSBmb3IgKGludCBpID0gMTsgaSA8PSAobGwpKG4pOyArK2kpCiNkZWZpbmUgZm9yYyhpLCBsLCByKSBmb3IgKGludCBpID0gKGxsKShsKTsgaSA8PSAobGwpKHIpOyArK2kpCiNkZWZpbmUgZm9ycjAoaSwgbikgZm9yIChpbnQgaSA9IChsbCkobikgLSAxOyBpID49IDA7IC0taSkKI2RlZmluZSBmb3JyMShpLCBuKSBmb3IgKGludCBpID0gKGxsKShuKTsgaSA+PSAxOyAtLWkpCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgZmkgZmlyc3QgIAojZGVmaW5lIGRlYnVnKHgpIGNvdXQgPDwgI3ggPDwgIiAtPiAiIDw8IHggPDwgZW5kbDsKI2RlZmluZSBlbmRsICdcbicKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBhbGwoeCkgKHgpLmJlZ2luKCksICh4KS5lbmQoKQojZGVmaW5lIHJhbGwoeCkgKHgpLnJiZWdpbiwgKHgpLnJlbmQoKQojZGVmaW5lIHRyKGMsaSkgZm9yKF9fdHlwZW9mX18oKGMpKS5iZWdpbigpIGkgPSAoYykuYmVnaW4oKTsgaSAhPSAoYykuZW5kKCk7IGkrKykKI2RlZmluZSBwcmVzZW50KGMseCkgKChjKS5maW5kKHgpICE9IChjKS5lbmQoKSkKI2RlZmluZSBjcHJlc2VudChjLHgpIChmaW5kKGFsbChjKSx4KSAhPSAoYykuZW5kKCkpCiNkZWZpbmUgc3ooYSkgbGwoKGEpLnNpemUoKSkKI2RlZmluZSBtb2QgMTAwMDAwMDAwNwojZGVmaW5lIElORiBMTE9OR19NQVgKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLy91c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsKdHlwZWRlZiB2ZWN0b3I8aW50PiB2aTsKdHlwZWRlZiB2ZWN0b3I8dmk+IHZ2aTsKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsKdHlwZWRlZiB2ZWN0b3I8aWk+IHZpaTsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgdmVjdG9yPGxsPiB2bGw7CnR5cGVkZWYgdmVjdG9yPHZsbD4gdnZsbDsKdHlwZWRlZiBkb3VibGUgbGQ7IAovL3R5cGVkZWYgdHJlZTxpbnQsIG51bGxfdHlwZSwgbGVzczxpbnQ+LCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPiBvcmRlcmVkX3NldDsKdm9pZCBkZWJ1Z192ZWModmVjdG9yPGxsPiZ2KXsgIAogICAgY291dCA8PCAnWyc7CiAgICBmb3IoYXV0byBpOnYpY291dCA8PCBpIDw8ICIsICI7IGNvdXQgPDwgIl0iOwogICAgY291dCA8PCAiXG4iOwp9ICAgCgp2b2lkIGRlYnVnX3NldChzZXQ8bGw+JnN0KXsgIAogICAgY291dCA8PCAieyI7CiAgICBmb3IoYXV0byBpOnN0KWNvdXQgPDwgaSA8PCAiLCAiOwogICAgY291dCA8PCAifSI7CiAgICBjb3V0IDw8ICJcbiI7Cn0gCgoKdm9pZCBmYXN0KCkKewogIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgY2luLnRpZSgwKTsKICBjb3V0LnRpZSgwKTsKfSAKCmJvb2wgcHJpbWVbMTAwMDAwMV07CnZvaWQgc2lldmUoKQp7CiAgbWVtc2V0KHByaW1lLCB0cnVlLCBzaXplb2YocHJpbWUpKTsKICBwcmltZVsxXT1mYWxzZTsKICBmb3IgKGludCBwPTI7IHAqcDw9MTAwMDAwMDsgcCsrKQogIHsKICAgIGlmIChwcmltZVtwXSA9PSB0cnVlKQogICAgewogICAgICAgIGZvciAoaW50IGk9cCpwOyBpPD0xMDAwMDAwOyBpICs9IHApCiAgICAgICAgICAgICAgICBwcmltZVtpXSA9IGZhbHNlOwogICAgfQogIH0KfSAKCnZvaWQgcHJpbnQoYm9vbCBmKXsgCiAgICBpZihmKWNvdXQgPDwgIllFU1xuIjsgCiAgICBlbHNlIGNvdXQgPDwgIk5PXG4iOwp9ICAKCnZvaWQgZ29vZ2xlKGludCB4KXsgIAogICAgY291dCA8PCAiQ2FzZSAjIiA8PCB4IDw8ICI6ICIgOwp9ICAKCmxsIGJpbmFyeV9leHBvKGxsIGEsbGwgYil7IAogICAgbGwgcmVzID0gMTsgCiAgICB3aGlsZShiICE9IDApeyAKICAgICAgICBpZihiJjEpeyAKICAgICAgICAgICAgcmVzID0gKHJlcyAqIGEpICUgbW9kOyAKICAgICAgICAgICAgCiAgICAgICAgfSAKICAgICAgICBiID4+PSAxOyAKICAgICAgICBhID0gKGEqYSklbW9kOwogICAgfSAKICAgIHJldHVybiByZXM7Cn0gCgp2b2lkIHNvbHZlKCkKewogICAgbGwgbjsgCiAgICBjaW4gPj4gbjsgCiAgICBsbCBhW25dOyAgCiAgICBsbCB0b3RhbCA9IDA7CiAgICBmb3IoaW50IGk9MDtpPG47aSsrKXsgCiAgICAgICAgY2luID4+IGFbaV07IAogICAgICAgIHRvdGFsICs9IChhW2ldICE9IDApPzE6MDsKICAgIH0gCiAgICB2ZWN0b3I8cGFpcjxsbCxsbD4+djsgCiAgICBtYXA8bGwsdmxsPm1wOyAgCiAgICBsbCBzdGFydCA9IDA7IAogICAgbXBbMGxsXS5wYigwbGwpOyAKICAgIGxsIHByZVtuXTsgCiAgICBmb3IoaW50IGk9MDtpPG47aSsrKXsgCiAgICAgICAgcHJlW2ldID0gYVtpXTsgCiAgICAgICAgaWYoaSA+PSAxKXByZVtpXSArPSBwcmVbaS0xXTsKICAgIH0gCiAgICBib29sIGYgPSBmYWxzZTsKICAgIGZvcihpbnQgaT0wO2k8bjtpKyspeyAgCiAgICAgICAgaWYoc3oobXBbcHJlW2ldXSkgPT0gMSl7IAogICAgICAgICAgICBmID0gdHJ1ZTsgCiAgICAgICAgICAgIGxsIHN0YXJ0X3NlZyA9ICptcFtwcmVbaV1dLmJlZ2luKCk7IAogICAgICAgICAgICBsbCBlbmRfc2VnID0gaSArIDE7IAogICAgICAgICAgICB0b3RhbCArPSBtYXgoKChlbmRfc2VnIC0gc3RhcnRfc2VnKSooZW5kX3NlZyAtIHN0YXJ0X3NlZyAtIDEpKS8yIC0gMSwwbGwpOyAKICAgICAgICAgICAgdG90YWwgKz0gbWF4KDBsbCwoKHN0YXJ0X3NlZyAtIHN0YXJ0KSooc3RhcnRfc2VnIC0gc3RhcnQgLSAxKSkvMik7IAogICAgICAgICAgICBzdGFydCA9ICptcFtwcmVbaV1dLmJlZ2luKCkgKyAxOyAKICAgICAgICAgICAgbGwgcmVzID0gKm1wW3ByZVtpXV0uYmVnaW4oKSArIDE7IAogICAgICAgICAgICB2LnBiKHtyZXMsZW5kX3NlZ30pOwogICAgICAgICAgICBtcC5jbGVhcigpOyAKICAgICAgICAgICAgaWYocmVzIDw9IG4pCiAgICAgICAgICAgIG1wW3ByZVtyZXMgLSAxXV0ucGIocmVzKTsKICAgICAgICB9ICAKICAgICAgICBlbHNlIHsgCiAgICAgICAgICAgIG1wW3ByZVtpXV0ucGIoaSArIDEpOwogICAgICAgIH0KICAgIH0gICAgCiAgICBkZWJ1Zyh0b3RhbCk7ZGVidWcoc3RhcnQpOwogICAgaWYoc3RhcnQgPD0gbikKICAgIHRvdGFsICs9IG1heCgwbGwsKChuIC0gc3RhcnQpKihuIC0gc3RhcnQgLSAxKSkvMik7IAogICAgZm9yKGF1dG8gaSA6IHYpeyAgCiAgICB0b3RhbCAtPSBtYXgoMGxsLCgoaS5zZWNvbmQgLSBpLmZpcnN0KSooaS5zZWNvbmQgLSBpLmZpcnN0IC0gMSkpLzIpOwp9CiAgICBjb3V0IDw8IHRvdGFsIDw8IGVuZGw7Cn0gCgppbnQgbWFpbigpCnsKICBmYXN0KCk7CiAgLypsbCB0OwogIGNpbiA+PiB0OwogIGZvcihpbnQgdHQgPSAxO3R0IDw9IHQgO3R0KyspKi8KICBzb2x2ZSgpOwoKcmV0dXJuIDA7Cn0K