#include <bits/stdc++.h>
using namespace std;
const int Maxn = 200009;
const long long inf = 0x7fffffffffffffffll;
long long a[Maxn];
long long dp[Maxn][2];
int n;
bool flag[Maxn][2];
struct P {
  int i, j;
  P(int _i, int _j) : i(_i), j(_j) {}
  bool operator==(const P &o) const { return i == o.i && j == o.j; }
  bool operator!=(const P &o) const { return !(*this == o); }
  P() {}
};
bool vis[Maxn][2];
void Dp(P c) {
  vector<P> vec;
  for (int i = c.i, j = c.j;;) {
    vec.push_back(P(i, j));
    long long &d = dp[i][j];
    if (d != -1) break;
    if (vis[i][j]) {
      d = inf;
      break;
    }
    vis[i][j] = 1;
    if (i == 1) {
      flag[i][j] = 1;
      if (j == 0)
        d = inf;
      else
        d = 0;
      break;
    }
    if (j == 0) {
      int next = i + a[i];
      if (next > n) {
        d = a[i];
        break;
      } else {
        i = next, j = !j;
      }
    } else {
      int next = i - a[i];
      if (next < 1) {
        d = a[i];
        break;
      } else {
        i = next, j = !j;
      }
    }
  }
  int i = vec.back().i, j = vec.back().j;
  vis[i][j] = 0;
  for (int k = int(vec.size()) - 2; k >= 0; --k) {
    P &nv = vec[k + 1];
    P &v = vec[k];
    vis[v.i][v.j] = 0;
    if (flag[nv.i][nv.j]) flag[v.i][v.j] = 1;
    if (dp[nv.i][nv.j] == inf) {
      dp[v.i][v.j] = inf;
    } else {
      dp[v.i][v.j] = dp[nv.i][nv.j] + a[v.i];
    }
  }
}
long long ans[Maxn];
int main() {
  while (cin >> n) {
    for (int i = 2; i <= n; ++i) {
      cin >> a[i];
    }
    memset(dp, -1, sizeof(dp));
    memset(flag, 0, sizeof(flag));
    memset(vis, 0, sizeof(vis));
    for (int i = 2; i <= n; ++i) {
      Dp(P(i, 1));
      ans[i] = dp[i][1];
      if (ans[i] == inf)
        ans[i] = -1;
      else {
        ans[i] += (flag[i][1] + 1) * (i - 1);
      }
    }
    for (int i = 2; i <= n; ++i) {
      cout << ans[i] << endl;
    }
  }
  return 0;
}
