#include using namespace std; typedef long long ll; typedef unsigned long long ull; #define REP(i, n) for(int i=0; ibool chmax(T &a, const T &b) { if (abool chmin(T &a, const T &b) { if (b node; public: SegmentTree(vector v){ n = 1; while(v.size() > n) n *= 2; node.resize(2*n-1); for(int i = 0; i < v.size(); i++) node[i+n-1] = v[i]; for(int i = n-1; i >= 0; i--) node[i] = node[2*i+1] + node[2*i+2]; } void add(int x, int t){ x += n-1; node[x] += t; while(x > 0){ x = (x-1) / 2; node[x] = node[2*x+1] + node[2*x+2]; } } int getsum(int a, int b, int k=0, int l=0, int r=-1){ if(r < 0) r = n; if(b <= l || r <= a) return 0; if(a <= l && r <= b) return node[k]; int rv = getsum(a, b, 2*k+1, l, (r+l)/2); int lv = getsum(a, b, 2*k+2, (r+l)/2, r); return rv+lv; } }; vector G[200100]; ll ans; void dfs(int v, SegmentTree& tree){ ans += tree.getsum(0, v); for(auto&& next : G[v]){ tree.add(next, 1); dfs(next, tree); tree.add(next, -1); } } int main(){ int N; cin >> N; REP(i,N-1){ int a; cin >> a; G[a].push_back(i+1); } vector A(200100); SegmentTree tree(A); tree.add(0, 1); dfs(0, tree); cout << ans << endl; return 0; }