#include <stdio.h>

int deal_thedepth(int N,int A[100000],int eda[100000],int *flag,int i);

int main(void)
{
    int N;
    int A[100000];
    int i;
    int *flag=0;
    //入力
    scanf("%d",&N);
    for(i=0;i<=N;i++){
        scanf("%d",A[i]);
    }
    //二分木(リスト)を作る必要はない
    //その深さの枝の数
    int eda[100000]={0};
    eda[0]=1;
    deal_thedepth(N,A,eda,flag,i+1);
    if(*flag==-1){
        int no=-1;
        printf("%d",no);
    }
    int sum=1;
    for(i=0;i<=N;i++){
        sum = eda[i] + sum;
    }
    printf("%d",sum);
    return 0;

}

//その深さの処理を行う関数
int deal_thedepth(int N,int A[100000],int eda[100000],int *flag,int i)
{   
    //すでにおわった
    if(*flag == -1 || *flag==1) return 0;
    //終了条件
    //次の深さのものはつくれない
    if((eda[i-1]-A[i])*2 < eda[i]){
        *flag ==-1;
        return 0;
    }

    //とりあえず最小の枝
    eda[i] = eda[i-1] - A[i];

    //正しく二分木が作れた
    //最深の根
    if((eda[i-1]== A[N]) && (i=N)){
        *flag=1;
        return 0;
    }
    //次の深さに行ける
    if(eda[i]>0){
        deal_thedepth(N,A,eda,flag,i+1);
    }
    //次の深さに行けない。
    //edaを大きくしてもう一回この深さで
    if(eda[i] > A[i+1]){
        eda[i]++;
        deal_thedepth(N,A,eda,flag,i);
    }

}