Problem:
Score : 700 points

Problem Statement

There is a sequence X of length N, where every element is initially 0. Let X_i denote the i-th element of X.

You are given a sequence A of length N. The i-th element of A is A_i. Determine if we can make X equal to A by repeating the operation below. If we can, find the minimum number of operations required.

Choose an integer i such that 1\leq i\leq N-1. Replace the value of X_{i+1} with the value of X_i plus 1.

Constraints

1 \leq N \leq 2 \times 10^5

0 \leq A_i \leq 10^9(1\leq i\leq N)

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1
:
A_N

Output

If we can make X equal to A by repeating the operation, print the minimum number of operations required. If we cannot, print -1.

Sample Input 1

4
0
1
1
2

Sample Output 1

3

We can make X equal to A as follows:

Choose i=2. X becomes (0,0,1,0).

Choose i=1. X becomes (0,1,1,0).

Choose i=3. X becomes (0,1,1,2).

Sample Input 2

3
1
2
1

Sample Output 2

-1

Sample Input 3

9
0
1
1
0
1
2
2
1
2

Sample Output 3

8

Solution in Rust (1.15.1) (judge verdict: Accepted)

// AtCoder My Practice
// author: Leonardone @ NEETSDKASU

// 9
// 0 1 1 0 1 2 2 1 2
// 
// 0 0 0 0 0 0 0 0 0
// 0 0 1 0 0 0 0 0 0 [1]
// 0 1 1 0 0 0 0 0 0 [2]
// 0 1 1 0 0 0 0 1 0 [3]
// 0 1 1 0 0 0 0 1 2 [4]
// 0 1 1 0 0 1 0 1 2 [5]
// 0 1 1 0 0 1 2 1 2 [6]
// 0 1 1 0 1 1 2 1 2 [7]
// 0 1 1 0 1 2 2 1 2 [8]
//
// 2
// 0 2 
//
// -1 
//
// 4
// 0 1 2 3
//
// 0 0 0 0
// 0 1 0 0 [1]
// 0 1 2 0 [2]
// 0 1 2 3 [3]
//
// 5
// 0 1 2 3 2
// 
// 0 0 0 0 0
// 0 0 0 1 0 [1]
// 0 0 0 1 2 [2]
// 0 1 0 1 2 [3]
// 0 1 2 1 2 [4]
// 0 1 2 3 2 [5]
//
// 6
// 0 1 2 3 4 3
//
// 0 0 0 0 0 0
// 0 0 0 1 0 0 [1]
// 0 0 0 1 2 0 [2]
// 0 0 0 1 2 3 [3]
// 0 1 0 1 2 3 [4]
// 0 1 2 1 2 3 [5]
// 0 1 2 3 2 3 [6]
// 0 1 2 3 4 3 [7]
//

fn main() {
	let mut stdin = String::new();
    std::io::Read::read_to_string(
    	&mut std::io::stdin(),
        &mut stdin).unwrap();
	let mut stdin = stdin.split_whitespace();
    let mut get = || stdin.next().unwrap();
    macro_rules! get {
    	($t:ty) => (get().parse::<$t>().unwrap());
        () => (get!(i64));
    }
    let n = get!(usize);
    let mut xs = vec![0; n];
    let mut ans = 0;
    for i in 0..xs.len() {
    	xs[i] = get!();
        if i > 0 {
        	let d = xs[i] - xs[i-1];
        	if d > 1 {
            	ans = -1;
                break;
            }
            if d < 1 {
            	ans += xs[i-1];
            }
        } else if xs[i] != 0 {
        	ans = -1;
            break;
        }
    }
    if ans >= 0 && n > 1 {
    		ans += xs[n-1];
    }
    println!("{}", ans);
}