func_code_string: #include <bits/stdc++.h>   using namespace std;   const int inf = 1e9 + 1;   const int N = 100123;   int z, n;   int a[N];   int best[N];   long long ans[N];   long long res;   pair<int, int> tree[N << 2];   void build(int v, int l, int r) {     if (l == r) {       tree[v] = {a[l], l};       return;     }     int mid = (l + r) >> 1;     build(2 * v, l, mid);     build(2 * v + 1, mid + 1, r);     tree[v] = max(tree[2 * v], tree[2 * v + 1]);   }   pair<int, int> query(int v, int l, int r, int ql, int qr) {     if (ql <= l && qr >= r) {       return tree[v];     }     int mid = (l + r) >> 1;     pair<int, int> res = {0, 0};     if (ql <= mid) res = max(res, query(2 * v, l, mid, ql, qr));     if (qr >= mid + 1) res = max(res, query(2 * v + 1, mid + 1, r, ql, qr));     return res;   }   int main() {     ios_base::sync_with_stdio(0);     cin >> n;     for (int i = 1; i <= n - 1; i++) {       cin >> a[i];     }     a[n] = n;     build(1, 1, n);     for (int i = 1; i <= n; i++) {       pair<int, int> b = query(1, 1, n, i, a[i]);       best[i] = b.second;     }     ans[n - 1] = 1;     res++;     for (int i = n - 2; i >= 1; i--) {       ans[i] = ans[best[i]] + (best[i] - i) + (n - a[i]);       res += ans[i];     }     cout << res << endl;   }   