#include <bits/stdc++.h>
#define ALL(obj) begin(obj), end(obj)
#define debug(x) cerr << #x << ": " << x << '\n'
using namespace std;
template <class T>
vector<T> make_vec(size_t a) {
    return vector<T>(a);
}
template <class T, class... Ts>
auto make_vec(size_t a, Ts... ts) {
    return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));
}
template <class T>
bool chmax(T &a, const T &b) {
    if (a < b) {
        a = b;
        return 1;
    }
    return 0;
}
template <class T>
bool chmin(T &a, const T &b) {
    if (b < a) {
        a = b;
        return 1;
    }
    return 0;
}
// 1次元 vector
template <class T>
ostream &operator<<(ostream &s, vector<T> vec) {
    for (int i = 0; i < (int)vec.size(); ++i) {
        if (i > 0) {
            s << " ";
        }
        s << vec[i];
    }
    return s << endl;
}
template <class T>  // 2次元 vector
ostream &operator<<(ostream &s, vector<vector<T>> vec2) {
    for (int i = 0; i < (int)vec2.size(); ++i) {
        s << vec2[i];
    }
    return s;
}

using ll = long long;
using ull = unsigned long long;
const int INF = 1e9;
// const int MOD = 1e9 + 7;
/* BIT: 区間和の更新や計算を行う構造体
    初期値は a_1 = a_2 = ... = a_n = 0
    ・add(l,r,x): [l,r) に x を加算する
    ・sum(i): a_1 + a_2 + ... + a_i を計算する
    ・query(l,r): [l,r) の区間の和を求める
    計算量は全て O(logn)
*/
template <typename T>
struct BIT {
    int n;             // 要素数
    vector<T> bit[2];  // データの格納先
    BIT(int n_) { init(n_); }
    void init(int n_) {
        n = n_ + 1;
        for (int p = 0; p < 2; p++) bit[p].assign(n, 0);
    }

    void add_sub(int p, int i, T x) {
        for (int idx = i; idx < n; idx += (idx & -idx)) {
            bit[p][idx] += x;
        }
    }
    void add(int l, int r, T x) {  // [l,r) に加算
        l = l + 1;
        r = r + 1;
        add_sub(0, l, -x * (l - 1));
        add_sub(0, r, x * (r - 1));
        add_sub(1, l, x);
        add_sub(1, r, -x);
    }

    T sum_sub(int p, int i) {
        T s(0);
        for (int idx = i; idx > 0; idx -= (idx & -idx)) {
            s += bit[p][idx];
        }
        return s;
    }
    T sum(int i) { return sum_sub(0, i) + sum_sub(1, i) * i; }

    // [l,r) の区間和を取得
    T query(int l, int r) {
        l = l + 1;
        r = r + 1;
        return sum(r - 1) - sum(l - 1);
    }
};

int main() {
    int N;
    cin >> N;
    vector<int> A(N + 1);
    BIT<ll> bit(N + 5);
    for (int i = 0; i < N + 1; i++) {
        cin >> A.at(i);
    }
    bit.add(0, N + 1, 1);
    if (N == 0) {
        if (A[0] == 1) {
            cout << 1 << endl;
        } else {
            cout << -1 << endl;
        }
        return 0;
    }

    int id = 0;
    ll ans = N + 1;
    A[N] -= 1;
    for (int a = 0; a <= N; a++) {
        if (A[a] > 0) {
            if (id >= a) {
                cout << -1 << endl;
                return 0;
            }
            ll red = bit.query(id, id + 1);

            while (id < a && red <= A[a]) {
                bit.add(id + 1, a, red);
                A[a] -= red;
                ans += (ll)(a - id) * (ll)red;
                id++;
                red = bit.query(id, id + 1);
            }
            if (red > A[a]) {
                bit.add(id, id + 1, -A[a]);
                bit.add(id + 1, a, A[a]);
                ans += (ll)(a - id) * (ll)A[a];
                A[a] = 0;
            } else if (A[a] > 0) {
                cout << -1 << endl;
                return 0;
            }
        }
    }
    cout << ans << endl;
}


Measured memory_bytes: 5108