#include <bits/stdc++.h>
#include <iostream>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<pair<int,int>,null_type,less<pair<int,int>>,rb_tree_tag,tree_order_statistics_node_update> ost;
typedef long long ll;
const int MAXN = 1e5+5;
int n, psa[MAXN];
/*
consider what happens in a operation
1: ai-1 += ai
2:ai+1 += ai
3: ai += -2ai
2 1 0 5 7 5 14
if we build a psum we just check if its possible to sort it using some operations
psa[1] must be non negative
operating on index i
all things before dont matter
psa[i-1] += a[i]
psa[i] += -2a[i] + a[i] = -a[i]
psa[i+1] += a[i] - a[i] = 0
all things after dont get contribution
so in one operation:
psa[i-1] += a[i] = psa[i] - psa[i-1]
psa[i] += -a[i] = -(psa[i] - psa[i-1])
psa[i-1] = psa[i]
psa[i] = psa[i-1]
so they just swap
*/
int main() {
cin >> n;
for(int i = 1; i <= n; i++){
cin >> psa[i];
psa[i] += psa[i-1];
}
for(int i = 1; i <= n; i++){
if(psa[i] < 0){
cout << "-1\n";
return 0;
}
}
ost t;
long long ans = 0;
for(int i = 1; i <= n; i++){
ans += i - t.order_of_key({psa[i], i}) - 1;
t.insert({psa[i], i});
}
cout << ans << "\n";
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPiAKI2luY2x1ZGUgPGV4dC9wYl9kcy90cmVlX3BvbGljeS5ocHA+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsKCnR5cGVkZWYgdHJlZTxwYWlyPGludCxpbnQ+LG51bGxfdHlwZSxsZXNzPHBhaXI8aW50LGludD4+LHJiX3RyZWVfdGFnLHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT4gb3N0OwoKdHlwZWRlZiBsb25nIGxvbmcgbGw7Cgpjb25zdCBpbnQgTUFYTiA9IDFlNSs1OwoKaW50IG4sIHBzYVtNQVhOXTsKCi8qCmNvbnNpZGVyIHdoYXQgaGFwcGVucyBpbiBhIG9wZXJhdGlvbgoxOiBhaS0xICs9IGFpCjI6YWkrMSArPSBhaQozOiBhaSArPSAtMmFpCgoyIDEgMCA1IDcgNSAxNAoKaWYgd2UgYnVpbGQgYSBwc3VtIHdlIGp1c3QgY2hlY2sgaWYgaXRzIHBvc3NpYmxlIHRvIHNvcnQgaXQgdXNpbmcgc29tZSBvcGVyYXRpb25zCnBzYVsxXSBtdXN0IGJlIG5vbiBuZWdhdGl2ZQoKb3BlcmF0aW5nIG9uIGluZGV4IGkKYWxsIHRoaW5ncyBiZWZvcmUgZG9udCBtYXR0ZXIKcHNhW2ktMV0gKz0gYVtpXQpwc2FbaV0gKz0gLTJhW2ldICsgYVtpXSA9IC1hW2ldCnBzYVtpKzFdICs9IGFbaV0gLSBhW2ldID0gMAphbGwgdGhpbmdzIGFmdGVyIGRvbnQgZ2V0IGNvbnRyaWJ1dGlvbgoKc28gaW4gb25lIG9wZXJhdGlvbjoKcHNhW2ktMV0gKz0gYVtpXSA9IHBzYVtpXSAtIHBzYVtpLTFdCnBzYVtpXSArPSAtYVtpXSA9IC0ocHNhW2ldIC0gcHNhW2ktMV0pCgpwc2FbaS0xXSA9IHBzYVtpXQpwc2FbaV0gPSBwc2FbaS0xXQoKc28gdGhleSBqdXN0IHN3YXAKKi8KCmludCBtYWluKCkgewogICAgY2luID4+IG47CgogICAgZm9yKGludCBpID0gMTsgaSA8PSBuOyBpKyspewogICAgICAgIGNpbiA+PiBwc2FbaV07CiAgICAgICAgcHNhW2ldICs9IHBzYVtpLTFdOwogICAgfQogICAgCiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKyl7CiAgICAgICAgaWYocHNhW2ldIDwgMCl7CiAgICAgICAgICAgIGNvdXQgPDwgIi0xXG4iOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBvc3QgdDsKICAgIGxvbmcgbG9uZyBhbnMgPSAwOwogICAgZm9yKGludCBpID0gMTsgaSA8PSBuOyBpKyspewogICAgICAgIGFucyArPSBpIC0gdC5vcmRlcl9vZl9rZXkoe3BzYVtpXSwgaX0pIC0gMTsKICAgICAgICB0Lmluc2VydCh7cHNhW2ldLCBpfSk7CiAgICB9CgogICAgY291dCA8PCBhbnMgPDwgIlxuIjsKfQoK