1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <bits/stdc++.h>
using namespace std;
typedef long long lld;
typedef pair<int,int> pii;
typedef pair<lld,lld> pll;
typedef vector<int> vint;
#define ff first
#define ss second
#define mp make_pair
#define pb push_back

int n,m=1,k,l;
lld t[524288];
int d[524288];
lld dp[524288];
lld suma,a,b;
const lld inf = 1ll<<60;

int main(){
	scanf("%d",&n);
	for(int i=0;i<n;++i){
		scanf("%lld",&a);
		if(a!=0) {
			t[m]=a;
			d[m]=i;
			dp[m]=inf;
			++m;
		}
		suma+=a;
	}
	if(suma < 0){
		puts("-1");
		exit(0);
	}
	a=0; k=1; l=0;
	for(int i=m-1;i>0;--i) d[i]-=d[i-1];
	d[1]=0;
	for(int i=1;i<m;++i){
		/*while((l==0 or a<0) and k<m){
			a+=t[k];
		}*/
		a=t[i]; l=0;
		for(int j=i;j<m;++j){
			if(t[j]>0) {
				dp[j]=min(dp[j], dp[j-1]);
			}
			if(a>=0){
				//printf("(%d) %lld -> (%d) %lld + %d\n",j,dp[j],i-1,dp[i-1],l);
				dp[j]=min(dp[j],dp[i-1]+l);
			}
			a+=t[j+1];
			l+=d[j+1];
		}
	}
	
	printf("%lld\n",dp[m-1]);
	
	
	return 0;
}
/*
17
2 -5 0 2 0 0 0 4 0 0 -1 4 0 0 0 0 -3


*/