#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T poww(T b, T p) {
  long long a = 1;
  while (p) {
    if (p & 1) {
      a = (a * b);
    }
    p >>= 1;
    b = (b * b);
  }
  return a;
}
template <class T>
inline T gcd(T a, T b) {
  if (b > a) return gcd(b, a);
  return ((b == 0) ? a : gcd(b, a % b));
}
long long sum[100001];
int tree[400000];
void init(int node, int s, int e, int* a) {
  if (s > e) return;
  if (s == e) {
    tree[node] = s;
    return;
  }
  init(node * 2, s, (s + e) / 2, a);
  init(node * 2 + 1, (s + e) / 2 + 1, e, a);
  tree[node] = (a[tree[node * 2]] > a[tree[node * 2 + 1]] ? tree[node * 2]
                                                          : tree[node * 2 + 1]);
}
int query(int node, int s, int e, int l, int r, int* a) {
  if (s > r || e < l)
    return -1;
  else if (s >= l && e <= r)
    return tree[node];
  int i = query(node * 2, s, (s + e) / 2, l, r, a);
  int j = query(node * 2 + 1, (s + e) / 2 + 1, e, l, r, a);
  if (j != -1 && a[j] > a[i]) i = j;
  return i;
}
int r[100001];
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int i, j, k, n;
  long long ans = 0;
  cin >> n;
  for ((i) = 0; (i) < (n - 1); (i)++) {
    cin >> r[i];
    r[i]--;
  }
  r[n - 1] = n - 1;
  init(1, 0, n - 1, r);
  for (i = n - 2; i >= 0; i--) {
    j = r[i];
    long long tans = (j - i);
    k = query(1, 0, n - 1, i, j, r);
    if (r[k] > j) {
      tans += sum[k] - (j - k);
      tans += (n - 1) - j;
    } else {
      tans += (n - 1) - j;
      tans += sum[j + 1];
    }
    sum[i] = tans;
    ans += tans;
  }
  cout << ans << "\n";
}
