#include <stdio.h>
#include <inttypes.h>

#define INF UINT64_C(123456789012345678)

int N;
uint64_t A[114514];

uint64_t saidai[114514];

int main(void) {
	int i;
	uint64_t chotensu = 0;
	uint64_t active = 1;
	if (scanf("%d", &N) != 1) return 1;
	for (i = 0; i <= N; i++) {
		if (scanf("%" SCNu64, &A[i]) != 1) return 1;
	}

	for (i = 0; i <= N; i++) {
		if (A[i] > active) {
			puts("-1");
			return 0;
		}
		saidai[i] = active - A[i];
		active = saidai[i] * 2;
		if (active > INF) active = INF;
	}

	chotensu = A[N];
	active = chotensu;
	for (i = N - 1; i >= 0; i--) {
		if (saidai[i] * 2 < active) {
			puts("-1");
			return 0;
		}
		if (active > saidai[i]) active = saidai[i];
		active += A[i];
		chotensu += active;
	}

	printf("%" PRIu64 "\n", chotensu);
	return 0;
}

/*

頂点数を最大にしたいので、1個から2個生やすより、2個から2個生やした方が有利
制約によって、各深さに置ける最大ノード数が決まる

*/
