Problem:
Score : 600 points

Problem Statement

Given is an integer sequence of length N+1: A_0, A_1, A_2, \ldots, A_N. Is there a binary tree of depth N such that, for each d = 0, 1, \ldots, N, there are exactly A_d leaves at depth d? If such a tree exists, print the maximum possible number of vertices in such a tree; otherwise, print -1.

Notes

A binary tree is a rooted tree such that each vertex has at most two direct children.

A leaf in a binary tree is a vertex with zero children.

The depth of a vertex v in a binary tree is the distance from the tree's root to v. (The root has the depth of 0.)

The depth of a binary tree is the maximum depth of a vertex in the tree.

Constraints

0 \leq N \leq 10^5

0 \leq A_i \leq 10^{8} (0 \leq i \leq N)

A_N \geq 1

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_0 A_1 A_2 \cdots A_N

Output

Print the answer as an integer.

Sample Input 1

3
0 1 1 2

Sample Output 1

7

Below is the tree with the maximum possible number of vertices. It has seven vertices, so we should print 7.

Sample Input 2

4
0 0 1 0 2

Sample Output 2

10

Sample Input 3

2
0 3 1

Sample Output 3

-1

Sample Input 4

1
1 1

Sample Output 4

-1

Sample Input 5

10
0 0 1 1 2 3 5 8 13 21 34

Sample Output 5

264

Solution in C# (Mono-csc 3.5.0) (judge verdict: Accepted)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class TEST{
	static void Main(){
		Sol mySol =new Sol();
		mySol.Solve();
	}
}

class Sol{
	public void Solve(){
		
		if(N == 0){
			Console.WriteLine(A[0] == 1 ? 1 : -1);
			return;
		}
		
		long Inf = (1L << 60);
		long[] cap = new long[N + 1];
		
		cap[0] = 1 - A[0];
		if(cap[0] <= 0){
			Console.WriteLine(-1);
			return;
		}
		for(int i=1;i<=N;i++){
			cap[i] = Math.Min(Inf, cap[i - 1] * 2 - A[i]);
			if(i == N){
				cap[i] = cap[i - 1] * 2;
			}
			if(i < N && cap[i] <= 0){
				Console.WriteLine(-1);
				return;
			}
		}
//Console.WriteLine(String.Join(" ",cap));		
		if(cap[N] < A[N]){
			Console.WriteLine(-1);
			return;
		}
//Console.WriteLine(String.Join(" ",cap));		
		
		long[] cnt = new long[N + 1];
		cnt[N] = A[N];
		for(int i=N-1;i>=0;i--){
			long nd = cnt[i + 1];
			if(nd > cap[i] * 2){
				Console.WriteLine(-1);
				return;
			}
			cnt[i] = A[i] + Math.Min(cap[i], nd);
		}
		
		
		long tot = 0;
		for(int i=0;i<=N;i++){
			tot += cnt[i];
		}
		Console.WriteLine(tot);
		
		
	}
	int N;
	long[] A;
	public Sol(){
		N = ri();
		A = rla();
	}

	static String rs(){return Console.ReadLine();}
	static int ri(){return int.Parse(Console.ReadLine());}
	static long rl(){return long.Parse(Console.ReadLine());}
	static double rd(){return double.Parse(Console.ReadLine());}
	static String[] rsa(char sep=' '){return Console.ReadLine().Split(sep);}
	static int[] ria(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>int.Parse(e));}
	static long[] rla(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>long.Parse(e));}
	static double[] rda(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>double.Parse(e));}
}