fun main() {
    val n = readLine()!!.toInt()
    val an = readLine()!!.split(" ").map(String::toLong)
    // 派手はない頂点の最大値
    val maxArr = LongArray(n + 1)
    maxArr[an.lastIndex] = an.last()
    for (i in an.lastIndex - 1 downTo 0) {
        maxArr[i] = maxArr[i + 1] + an[i]
    }

    // 根しかない場合
    if (n == 0) {
        if (an.first() == 1L) {
            println(1)
            return
        } else {
            println(-1)
            return
        }

    }
    // 根がおかしい場合
    if (0 < n) {
        if (an[0] == 1L) {
            println(-1)
            return
        }
    }

    // 根はループで処理しない
    var count = 1L
    var previousValue = 1L
    for (i in 1 until an.lastIndex) {
        // 前回の葉ではない頂点から、必要な葉の数が作れるか？
        if (previousValue * 2 < an[i]) {
            println(-1)
            return
        }

        val maxCurrentValue = previousValue * 2 - an[i]

        val currentValue = Math.min(maxCurrentValue, maxArr[i + 1])
//        println("$currentValue ${an[i]}")
        count += (currentValue + an[i])
        previousValue = currentValue
    }

    if(previousValue * 2 < an.last()){
        println(-1)
        return
    }
    count += an.last()

    println(count)
}