#include <iostream>
using namespace std;
#define MAX(a, b) a>b?a:b;
int n, tree[1000002][3], maxn=1;
int que[10000002];
int bfs(int pos)
{
int tail=1, t=1, top=1, root=1;
bool u;
que[1]=pos;
for(;;)
{
u=0;
for(int i=tail;i<=top;i++)
{
if(que[i]!=-1) que[++t]=tree[que[i]][1]; if(que[t]!=-1) root++;
if(que[i]!=-1) que[++t]=tree[que[i]][2]; if(que[t]!=-1) root++;
}
tail=top+1;
top=t;
for(int i=(tail+t)/2+1;i<=t;i++)
{
if(tree[que[i]][0]!=tree[que[tail+t-i]][0])
{
return 0;
}
else if(que[i]!=-1) u=1;
}
if(not u) return root;
}
}
void dfs(int pos)
{
if(pos==-1) return;
int b=bfs(pos);
maxn=MAX(b, maxn);
dfs(tree[pos][1]);
dfs(tree[pos][2]);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>tree[i][0];
int a, b;
for(int i=1;i<=n;i++)
{
cin>>a>>b;
tree[i][1]=a;
tree[i][2]=b;
}
dfs(1);
cout<<maxn;
return 0;
}
80分dfs+bfs求助