#include <bits/stdc++.h>
using namespace std;
long long int MOD = 1000000007;
long double EPS = 1e-9;
template <class second, class T>
ostream& operator<<(ostream& os, const pair<second, T>& p) {
  return os << "(" << p.first << ", " << p.second << ")";
}
template <class T>
ostream& operator<<(ostream& os, const vector<T>& p) {
  os << "[ ";
  for (auto& it : p) os << it << " ";
  return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, const unordered_set<T>& p) {
  os << "[ ";
  for (auto& it : p) os << it << " ";
  return os << "]";
}
template <class second, class T>
ostream& operator<<(ostream& os, const unordered_map<second, T>& p) {
  os << "[ ";
  for (auto& it : p) os << it << " ";
  return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, const set<T>& p) {
  os << "[ ";
  for (auto& it : p) os << it << " ";
  return os << "]";
}
template <class second, class T>
ostream& operator<<(ostream& os, const map<second, T>& p) {
  os << "[ ";
  for (auto& it : p) os << it << " ";
  return os << "]";
}
template <class T>
void dbs(string str, T t) {
  cerr << str << " : " << t << "\n";
}
template <class T, class... second>
void dbs(string str, T t, second... s) {
  int idx = str.find(',');
  cerr << str.substr(0, idx) << " : " << t << ",";
  dbs(str.substr(idx + 1), s...);
}
template <class T>
void prc(T a, T b) {
  cerr << "[";
  for (T i = a; i != b; ++i) {
    if (i != a) cerr << ", ";
    cerr << *i;
  }
  cerr << "]\n";
}
void pre() {}
long long int n;
long long int arr[200200];
long long int dist[200200][2];
pair<long long int, long long int> nexter[200200][2];
int firstnode[200200][2];
void dfs(int node, int type) {
  int v = nexter[node][type].first;
  long long int tt = nexter[node][type].second;
  dist[node][type] = -1;
  if (v <= 0 || v > n) {
    dist[node][type] = tt;
  } else if (v == 1) {
    if (type == 1) {
      dist[node][type] = -1;
    } else {
      firstnode[node][type] = 1;
      dist[node][type] = tt;
    }
  } else {
    if (!dist[v][type ^ 1]) {
      dfs(v, type ^ 1);
    }
    if (dist[v][type ^ 1] > 0) {
      dist[node][type] = dist[v][type ^ 1] + tt;
    } else if (dist[v][type ^ 1] == -1) {
      dist[node][type] = -1;
    }
  }
}
void solve() {
  cin >> n;
  for (long long int i = 2; i <= n; ++i) cin >> arr[i];
  for (long long int i = 2; i <= n; ++i) {
    nexter[i][0] = make_pair(i + arr[i], arr[i]);
    nexter[i][1] = make_pair(i - arr[i], arr[i]);
  }
  for (long long int i = 2; i <= n; ++i)
    for (long long int j = 0; j <= 1; ++j)
      if (!dist[i][j]) dfs(i, j);
  for (long long int i = 1; i <= n - 1; ++i) {
    int cur = 1 + i;
    int dis = i;
    if (dist[cur][1] >= 0) {
      cout << dis + dist[cur][1] + (firstnode[cur][1] == 1) * i << '\n';
    } else
      cout << -1 << '\n';
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  pre();
  int t = 1;
  for (int i = 1; i <= t; i++) {
    solve();
  }
}
