Example

Input

4
1 1 2


Output

6
#include <bits/stdc++.h>
#define For(i, a, b) for(int (i)=(int)(a); (i)<(int)(b); ++(i))
#define rFor(i, a, b) for(int (i)=(int)(a)-1; (i)>=(int)(b); --(i))
#define rep(i, n) For((i), 0, (n))
#define rrep(i, n) rFor((i), (n), 0)
#define fi first
#define se second
using namespace std;
typedef long long lint;
typedef unsigned long long ulint;
typedef pair<int, int> pii;
typedef pair<lint, lint> pll;
template<class T> bool chmax(T &a, const T &b){if(a<b){a=b; return true;} return false;}
template<class T> bool chmin(T &a, const T &b){if(a>b){a=b; return true;} return false;}
template<class T> T div_floor(T a, T b){
    if(b < 0) a *= -1, b *= -1;
    return a>=0 ? a/b : (a+1)/b-1;
}
template<class T> T div_ceil(T a, T b){
    if(b < 0) a *= -1, b *= -1;
    return a>0 ? (a-1)/b+1 : a/b;
}

constexpr lint mod = 1000000007;
constexpr lint INF = mod * mod;
constexpr int MAX = 100010;

typedef struct UnionFindTree{
    vector<int> par;

    UnionFindTree(int n){
        par.resize(n, -1);
    }

    bool is_root(int x){
        return par[x]<0;
    }

    int find(int x){
        if(is_root(x)) return x;
        return par[x] = find(par[x]);
    }

    int size(int x){
        return -par[find(x)];
    }

    bool unite(int x, int y){
        x = find(x);
        y = find(y);
        if(x == y) return false;
        if(size(x) < size(y)) swap(x, y);
        par[x] += par[y];
        par[y] = x;
        return true;
    }

    bool same(int x, int y){
        return find(x) == find(y);
    }
}UF;

int n;
vector<int> G[MAX];
UF uf(MAX);
int lca[MAX];
vector<int> lca_query[MAX];
lint dist[MAX], ans;

void bfs(){
    queue<int> que;
    int pv = -1;
    que.push(0);
    while(!que.empty()){
        int v = que.front();
        que.pop();
        if(pv >= 0){
            lca_query[pv].push_back(v);
            lca_query[v].push_back(pv);
        }
        pv = v;
        for(auto nv: G[v])if(dist[nv] == 0){
            dist[nv] = dist[v] + 1;
            que.push(nv);
        }
    }
}

void lca_dfs(int v){
    lca[v] = v;
    for(auto nv: lca_query[v]){
        int pv = lca[uf.find(nv)];
        if(pv >= 0) ans += dist[v] + dist[nv] - 2 * dist[pv];
    }
    for(auto nv: G[v]){
        lca_dfs(nv);
        uf.unite(v, nv);
        lca[uf.find(v)] = v;
    }
}

int main(){
    scanf("%d", &n);
    For(i, 1, n){
        int p;
        scanf("%d", &p);
        --p;
        G[p].push_back(i);
    }
    bfs();
    fill(lca, lca+n, -1);
    lca_dfs(0);
    printf("%lld\n", ans);
}
