#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int N=1e6+50;
ull base1=10000019,base2=10000079,n;
int ans=-1;
struct Node{
int ls,rs,val,sz;
ull h1,h2;//h1==h2说明对称
}a[N];
void dfs1(int u){//左边乘base1,右边乘base2
if(a[u].ls==0 && a[u].rs==0){//叶子节点
a[u].h1=a[u].val;
return;
}
if(a[u].ls!=0) dfs1(a[u].ls);
if(a[u].rs!=0) dfs1(a[u].rs);
a[u].h1 = a[ a[u].ls ].h1 * base1 + a[ a[u].rs ].h1 * base2 + a[u].val;
}
void dfs2(int u){//左边乘base2,右边乘base1
if(a[u].ls==0 && a[u].rs==0){//叶子节点
a[u].h2=a[u].val;
return;
}
if(a[u].ls!=0) dfs2(a[u].ls);
if(a[u].rs!=0) dfs2(a[u].rs);
a[u].h2 = a[ a[u].ls ].h2 * base2 + a[ a[u].rs ].h2 * base1 + a[u].val;
}
void dfs3(int u){//求每个节点的子树大小
a[u].sz=1;
if(a[u].ls!=0){
dfs3(a[u].ls);
a[u].sz+=a[ a[u].ls ].sz;
}
if(a[u].rs!=0){
dfs3(a[u].rs);
a[u].sz+=a[ a[u].rs ].sz;
}
}
void dfs4(int u){//统计答案
if(a[u].h1==a[u].h2) ans=max(ans,a[u].sz);//h1==h2说明左右对称
if(a[u].ls!=0) dfs4(a[u].ls);
if(a[u].rs!=0) dfs4(a[u].rs);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].val;
for(int i=1;i<=n;i++) cin>>a[i].ls>>a[i].rs;
for(int i=1;i<=n;i++){
if(a[i].ls==-1) a[i].ls=0;//把-1改成0好操作一点
if(a[i].rs==-1) a[i].rs=0;
}
dfs1(1);
dfs2(1);
dfs3(1);
dfs4(1);
cout<<ans;
return 0;
}