#include <bits/stdc++.h>
using namespace std;
#define p_qu priority_queue
#define p_qu_less priority_queue<int, vector<int>, greater<int> >
#define C_in(a,n) for(int i=0;i<n;i++) cin>>a[i]
#define C_out(a,n) for(int i=0;i<n;i++) cout<<a[i]<<" "
#define SUM(a,n,sum) sum[0]=a[0];for(int i=1;i<n;i++) sum[i]=sum[i-1]+a[i];
#define SUM2(a,n,m,sum) sum[0][0]=a[0][0]; for(int i=0;i<n;i++) for(int j=0;j<m;j++) sum[i][j]=(i!=0?sum[i-1][j]:0)+(j!=0?sum[i][j-1]:0)+a[i][j]-(i!=0 && j!=0?sum[i-1][j-1]:0)
#define all(a) a.begin(),a.end()
#define l_b lower_bound
#define u_b upper_bound
#define pb push_back
#define max_3(a,b,c) max(max(a,b),c)
#define max_4(a,b,c,d) max(a,max_3(b,c,d))
#define min_3(a,b,c) min(min(a,b),c)
#define min_4(a,b,c,d) min(a,min_3(b,c,d))
#define zero(a) memset(a, 0, sizeof(a))
#define msit multiset<int>::iterator
#define setit set<int>::iterator
#define int long long
const int N=500005;
const int MAX=(1<<31)-1;
struct tree{
int num;
int l;
int r;
int point;
int father;
}p[2222222];
int n;
int ha[2222222];
void _hash(int x)
{
if(p[x].l==-1 && p[x].r==-1)
{
ha[x]=p[x].num*p[x].num;
return;
}
int left=1;
if(p[x].l!=-1)
{
_hash(p[x].l);
left+=ha[p[x].l];
ha[x]+=97*left;
}
int right=3;
if(p[x].r!=-1)
{
_hash(p[x].r);
right+=ha[p[x].r];
ha[x]+=101*right;
}
ha[x]+=p[x].num*p[x].num;
return;
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>p[i].num;
p[i].father=-1;
}
for(int i=1;i<=n;i++)
{
int x,y;
cin>>x>>y;
p[i].l=x;
p[i].r=y;
if(x!=-1) p[x].father=i;
if(y!=-1) p[y].father=i;
int pp=0;
if(x!=-1) pp++;
if(y!=-1) pp++;
int j=i;
while(j!=-1)
{
p[j].point+=pp;
j=p[j].father;
}
}
_hash(1);
int Max=0;
for(int i=1;i<=n;i++)
{
if(p[i].l<0 || p[i].r<0) continue;
if(ha[p[i].l]==ha[p[i].r])
{
Max=max(Max,p[i].point);
}
}
cout<<(Max+1);
return 0;
}