#include #include #include #include #include #include #include #include #include #include #include static const int MOD = 1000000007; using ll = long long; using u32 = uint32_t; using namespace std; template constexpr T INF = ::numeric_limits::max()/32*15+208; template class BIT { vector bit; public: BIT(int n): bit(vector(n+1, 0)){} T sum(int k){ T ret = 0; for (++k; k > 0; k -= (k & -k)) ret += bit[k]; return ret; } void add(int k, T x){ for (++k; k < bit.size(); k += (k & -k)) bit[k] += x; } }; class euler_tour { void dfs_sz(int v){ for (auto &&u : G[v]) { if(u == par[v]) continue; par[u] = v; dep[u] = dep[v] + 1; dfs_sz(u); sub_size[v] += sub_size[u]; if(sub_size[u] > sub_size[G[v][0]]) swap(u, G[v][0]); } } void dfs_hld(int v, int c, int &pos){ id[v] = pos++; id_inv[id[v]]= v; tree_id[v] = c; for (auto &&u : G[v]) { if(u == par[v]) continue; head[u] = (u == G[v][0] ? head[v] : u); dfs_hld(u, c, pos); } } public: int n; vector> G; vector par, dep, sub_size, id, id_inv, tree_id, head; explicit euler_tour(int n) : n(n), G(n), par(n), dep(n), sub_size(n, 1), id(n), id_inv(n), tree_id(n), head(n){} explicit euler_tour(vector> &G) : G(G), n(n), par(n), dep(n) , sub_size(n), id(n), id_inv(n), tree_id(n), head(n) {} void add_edge(int u, int v){ G[u].emplace_back(v); G[v].emplace_back(u); } void build(vector roots = {0}){ int c = 0, pos = 0; for (auto &&i : roots) { dfs_sz(i); head[i] = i; dfs_hld(i, c++, pos); } } }; int main() { int n; cin >> n; euler_tour G(n); for (int i = 1; i < n; ++i) { int x; scanf("%d", &x); G.add_edge(x, i); } G.build(); ll ans = 0; BIT b(n); for (int j = n - 1; j >= 0; --j) { ans += b.sum(G.id[j]+G.sub_size[j]-1)-b.sum(G.id[j]); b.add(G.id[j], 1); } cout << ans << "\n"; return 0; }