Problem:
Score : 300 points

Problem Statement

You are given an integer sequence of length N. The i-th term in the sequence is a_i.
In one operation, you can select a term and either increment or decrement it by one.

At least how many operations are necessary to satisfy the following conditions?

For every i (1≤i≤n), the sum of the terms from the 1-st through i-th term is not zero.

For every i (1≤i≤n-1), the sign of the sum of the terms from the 1-st through i-th term, is different from the sign of the sum of the terms from the 1-st through (i+1)-th term.

Constraints

2 ≤ n ≤ 10^5

|a_i| ≤ 10^9

Each a_i is an integer.

Input

Input is given from Standard Input in the following format:

n
a_1 a_2 ... a_n

Output

Print the minimum necessary count of operations.

Sample Input 1

4
1 -3 1 0

Sample Output 1

4

For example, the given sequence can be transformed into 1, -2, 2, -2 by four operations. The sums of the first one, two, three and four terms are 1, -1, 1 and -1, respectively, which satisfy the conditions.

Sample Input 2

5
3 -6 4 -5 7

Sample Output 2

0

The given sequence already satisfies the conditions.

Sample Input 3

6
-1 4 3 2 -5 4

Sample Output 3

8

Solution in Common Lisp (SBCL 1.1.14) (judge verdict: Time Limit Exceeded)

(defun solver ()
  (let* ((n (read))
         (numv (make-array n :fill-pointer 0))
         (sum 0) (presum 0) (count 0))
    (loop repeat n
          do (vector-push (read) numv))
    (loop for x across numv
          do (incf sum x)
          (loop
            (cond ((and (zerop sum) (plusp presum))
                   (decf sum) (incf count))
                  ((and (zerop sum) (minusp presum))
                   (incf sum) (incf count))
                  ((and (plusp sum) (plusp presum))
                   (decf sum) (incf count))
                  ((and (plusp sum) (minusp presum))
                   (return))
                  ((and (minusp sum) (plusp presum))
                   (return))
                  ((and (minusp sum) (minusp presum))
                   (incf sum) (incf count))
                  (t (return))))
          (setf presum sum))
    (format t "~A~%" count)))

(solver)