#include "bits/stdc++.h"
#include <chrono>
#include <random>

#define INF 1000000007
#define F first
#define S second
#define PB push_back
#define MP make_pair
#define REP(i,a,b) for (int i = a; i < b; i++)
#define NIL 0

#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,fma,mmx,avx,tune=native")


using namespace std; 



typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef unordered_map<int,int> umi ;
typedef unordered_set<int> usi ;
typedef pair<int,int> pi;

struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};

bool ldequal(ld  a ,ld b){
    return abs(a-b) < 1e-9  ;
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
// shuffle(permutation.begin(), permutation.end(), rng); for permute 
// uniform_int_distribution<int>(0, i)(rng) for rand

void __print(int x) {cerr << x;}
void __print(long x) {cerr << x;}
void __print(long long x) {cerr << x;}
void __print(unsigned x) {cerr << x;}
void __print(unsigned long x) {cerr << x;}
void __print(unsigned long long x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}

template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifndef ONLINE_JUDGE
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
#define debug(x...)
#endif



const ll N =1e18+1;


void gen(){} ;
bool tests=false ;


void solve(){
    unordered_map<ll,ll ,custom_hash> M ;
    ll e=0 ,o=0 ;
    M[0]++ ;
    int n ;
    cin>>n ;
    ll res =0 ,temp;
    REP(i,0,n){
        cin>>temp; 
        if(i%2==0) e+=temp ;
        else o+=temp ;
        debug(i,e,o,temp,M[e-o]) ;
        res+=M[e-o] ;
        M[e-o]++ ;
    } 
    cout<<res ;



}
  
  
  


 

int main(){
    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif
    ios::sync_with_stdio(0);
    cin.tie(0);
    gen() ;
    long long test =1 ;
    if(tests) cin>>test ;
    REP(i,1,test+1){
        debug(i) ;
        //cout<<"Case #"<<i<<": " ;

        solve() ;
        //cout<<"\n" ;
    }
    return 0 ;
}
#include<bits/stdc++.h>
using namespace std;

const int mn=1e5+67;
int f[mn],n,siz[mn];
vector<int> to[mn];

void dfs(int x)
{
    siz[x]=1;
    int sum=0;
    vector<int> vec;vec.clear();
    for(auto t:to[x]) {
        dfs(t);
        siz[x]+=siz[t];
        if(siz[t]%2) {
            vec.push_back(-f[t]);
        }
        else {
            if(f[t]<0) f[x]-=-f[t];
            else sum+=-f[t];
        }
    }
    sort(vec.begin(),vec.end(),greater<int> {});
    vec.push_back(sum);
    for(int i=0;i<vec.size();++i) {
        if(i%2) f[x]+=vec[i];
        else f[x]-=vec[i];
    }
}

int main()
{
    scanf("%d",&n);
    int p;
    for(int i=2;i<=n;++i) {
        scanf("%d",&p);
        to[p].push_back(i);
    }
    for(int i=1;i<=n;++i) f[i]=1;
    dfs(1);
    printf("%d",(n+f[1])/2);
}