#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef pair<int,int> PII;
#define orgin first
#define mx second
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=200010;
int n,first[maxn],ce,A,deep[maxn],dfs_clock,pa[20][maxn],tag[maxn<<2],L[maxn],R[maxn],pos[maxn],now_ans,ans[maxn];
PII a[maxn<<2];
LL final_ans;
struct Edge
{
int u,v,next;
Edge() {}
Edge(int _1,int _2,int _3):u(_1),v(_2),next(_3) {}
}e[maxn<<1];
void addEdge(int a,int b)
{
e[++ce]=Edge(a,b,first[a]);first[a]=ce;
e[++ce]=Edge(b,a,first[b]);first[b]=ce;
}
void dfs(int now,int fa)
{
L[now]=++dfs_clock;
pos[dfs_clock]=now;
for(int i=first[now];i!=-1;i=e[i].next)
if(e[i].v!=fa)
deep[e[i].v]=deep[now]+1,
pa[0][e[i].v]=now,
dfs(e[i].v,now);
R[now]=dfs_clock;
}
int MAX(int x,int y){return deep[x]>deep[y] ? x : y;}
int jump(int now,int step)
{
int tmp=0;
for(int i=0;step;i++)
{
if(step&1)now=pa[i][now];
step>>=1;
}
return now;
}
void build(int L,int R,int o)
{
tag[o]=0;
if(L==R)
{
a[o]=make_pair(pos[L],pos[L]);
return;
}
int mid=L+R>>1,lo=o<<1,ro=lo|1;
build(L,mid,lo);build(mid+1,R,ro);
a[o].orgin=a[o].mx=MAX(a[lo].mx,a[ro].mx);
}
void pushdown(int L,int R,int o)
{
int lo=o<<1,ro=lo|1;
if(tag[o]==1)a[lo].mx=a[ro].mx=0;
else a[lo].mx=a[lo].orgin,a[ro].mx=a[ro].orgin;
tag[lo]=tag[ro]=tag[o];
tag[o]=0;
}
void update(int L,int R,int o,int ql,int qr)
{
if(L==ql && R==qr)
{
tag[o]=1;
a[o].mx=0;
return;
}
if(tag[o])pushdown(L,R,o);
int mid=L+R>>1,lo=o<<1,ro=lo|1;
if(qr<=mid)update(L,mid,lo,ql,qr);
else if(ql>mid)update(mid+1,R,ro,ql,qr);
else update(L,mid,lo,ql,mid),update(mid+1,R,ro,mid+1,qr);
a[o].mx=MAX(a[lo].mx,a[ro].mx);
}
int calc(int index)
{
int cnt=0;
while(1)
{
int x=a[1].mx;
if(!x)break;
int y=jump(x,index);
cnt++;
update(1,n,1,L[y],R[y]);
}
tag[1]=2;a[1].mx=a[1].orgin;
return cnt;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
ce=-1;dfs_clock=0;final_ans=0;
for(int i=1;i<=n;i++)first[i]=-1,deep[i]=0,ans[i]=n+1;
for(int i=1;i<n;i++)A=read(),addEdge(A,i+1);
deep[1]=1;dfs(1,0);pa[0][1]=1;
for(int Log=1;(1<<Log)<=n;Log++)
for(int i=1;i<=n;i++)
pa[Log][i]=pa[Log-1][pa[Log-1][i]];
build(1,n,1);
for(int i=n;i;i--)ans[calc(i)]=i;
for(int i=2;i<=n;i++)ans[i]=min(ans[i-1],ans[i]);
for(int i=1;i<n;i++)final_ans+=ans[i];
printf("%lld\n",final_ans);
}
return 0;
}