N=int(eval(input()))

A=list(map(int,input().split()))

node=[1 for _ in range(N+1)]

Sn=sum(A)

S=[Sn]

for s in range(N):

    S.append(S[s]-A[s+1])



ans=1

for i in range(1,N+1):

    if node[i-1]*2<=S[i-1]:

        ans+=node[i-1]*2

        node[i]=node[i-1]*2

    elif node[i-1]<=S[i-1]<node[i-1]*2:

        node[i]=S[i-1]

        ans+=S[i-1]

    node[i]-=A[i]

    if node[i]<0:

        ans=-1

        break



if A[0]>0:

    ans=-1

if N==0 and A[0]==1:

    ans=1



print(ans)
N=int(eval(input()))

A=list(map(int,input().split()))

node=[1 for _ in range(N+1)] #深さiで、葉にならない頂点の個数node[i]

S=sum(A) #生産しなければならない葉の枚数の合計

ans=1 #深さ0である根は最初にカウントする



#深さiの時点であと何枚の葉が必要か計算しつつ、必要な分だけノードを生産する

#ノードの個数がその時点でのSまで届いたら、あとは各頂点が1つずつノードを生産し、

#各層でA[i]個のノードが生産を止めて葉となる



for i in range(1,N+1): 

    if node[i-1]*2<=S: #葉の生産量はノードの2倍ずつ、ノルマを超えるまでは最速で生産する

        ans+=node[i-1]*2

        node[i]=node[i-1]*2

    elif node[i-1]<=S<node[i-1]*2: #全てのノードが2倍になるとノルマを過ぎてしまう場合はノルマピッタリで止める

        node[i]=S

        ans+=S

    node[i]-=A[i] #葉となるノード数を差し引き、生産に寄与するノード数にして次の層に引き継ぐ

    S-=A[i] #葉になった枚数だけノルマも減らす

    if node[i]<0: #生産が間に合わなかった場合(要求された葉＞生産可能なノード数)はループ停止

        ans=-1

        break



if A[0]>0: #深さ0に葉があったら基本的にアウトだが…

    ans=-1

if N==0 and A[0]==1: #N=0の時だけ、深さ0に葉が1つという状況が許される

    ans=1



print(ans)
N = int(eval(input()))
A = list(map(int, input().split()))
node = [1 for _ in range(N + 1)]
Sn = sum(A)
S = [Sn]
for s in range(N):
    S.append(S[s] - A[s + 1])
ans = 1
for i in range(1, N + 1):
    if node[i - 1] * 2 <= S[i - 1]:
        ans += node[i - 1] * 2
        node[i] = node[i - 1] * 2
    elif node[i - 1] <= S[i - 1] < node[i - 1] * 2:
        node[i] = S[i - 1]
        ans += S[i - 1]
    node[i] -= A[i]
    if node[i] < 0:
        ans = -1
        break
if A[0] > 0:
    ans = -1
if N == 0 and A[0] == 1:
    ans = 1
print(ans)

N = int(eval(input()))
A = list(map(int, input().split()))
node = [1 for _ in range(N + 1)]  # 深さiで、葉にならない頂点の個数node[i]
S = sum(A)  # 生産しなければならない葉の枚数の合計
ans = 1  # 深さ0である根は最初にカウントする
# 深さiの時点であと何枚の葉が必要か計算しつつ、必要な分だけノードを生産する
# ノードの個数がその時点でのSまで届いたら、あとは各頂点が1つずつノードを生産し、
# 各層でA[i]個のノードが生産を止めて葉となる
for i in range(1, N + 1):
    if node[i - 1] * 2 <= S:  # 葉の生産量はノードの2倍ずつ、ノルマを超えるまでは最速で生産する
        ans += node[i - 1] * 2
        node[i] = node[i - 1] * 2
    elif node[i - 1] <= S < node[i - 1] * 2:  # 全てのノードが2倍になるとノルマを過ぎてしまう場合はノルマピッタリで止める
        node[i] = S
        ans += S
    node[i] -= A[i]  # 葉となるノード数を差し引き、生産に寄与するノード数にして次の層に引き継ぐ
    S -= A[i]  # 葉になった枚数だけノルマも減らす
    if node[i] < 0:  # 生産が間に合わなかった場合(要求された葉＞生産可能なノード数)はループ停止
        ans = -1
        break
if A[0] > 0:  # 深さ0に葉があったら基本的にアウトだが…
    ans = -1
if N == 0 and A[0] == 1:  # N=0の時だけ、深さ0に葉が1つという状況が許される
    ans = 1
print(ans)

-node = [1 for _ in range(N + 1)] -Sn = sum(A) -S = [Sn] -for s in range(N): -    S.append(S[s] - A[s + 1]) -ans = 1 +node = [1 for _ in range(N + 1)]  # 深さiで、葉にならない頂点の個数node[i] +S = sum(A)  # 生産しなければならない葉の枚数の合計 +ans = 1  # 深さ0である根は最初にカウントする +# 深さiの時点であと何枚の葉が必要か計算しつつ、必要な分だけノードを生産する +# ノードの個数がその時点でのSまで届いたら、あとは各頂点が1つずつノードを生産し、 +# 各層でA[i]個のノードが生産を止めて葉となる -    if node[i - 1] * 2 <= S[i - 1]: +    if node[i - 1] * 2 <= S:  # 葉の生産量はノードの2倍ずつ、ノルマを超えるまでは最速で生産する -    elif node[i - 1] <= S[i - 1] < node[i - 1] * 2: -        node[i] = S[i - 1] -        ans += S[i - 1] -    node[i] -= A[i] -    if node[i] < 0: +    elif node[i - 1] <= S < node[i - 1] * 2:  # 全てのノードが2倍になるとノルマを過ぎてしまう場合はノルマピッタリで止める +        node[i] = S +        ans += S +    node[i] -= A[i]  # 葉となるノード数を差し引き、生産に寄与するノード数にして次の層に引き継ぐ +    S -= A[i]  # 葉になった枚数だけノルマも減らす +    if node[i] < 0:  # 生産が間に合わなかった場合(要求された葉＞生産可能なノード数)はループ停止 -if A[0] > 0: +if A[0] > 0:  # 深さ0に葉があったら基本的にアウトだが… -if N == 0 and A[0] == 1: +if N == 0 and A[0] == 1:  # N=0の時だけ、深さ0に葉が1つという状況が許される