#21-#25测试点TLE,求大佬指点
#include<bits/stdc++.h>
using namespace std;
int ans=-1;
vector<int> value,id,mid,lid,rid;
struct Node{
int v,l,r;
Node(int v0=0,int l0=-1,int r0=-1) : v(v0),l(l0),r(r0) {}
bool operator < (const Node &b) const {
return (v<b.v) || (v==b.v && l<b.l) || (v==b.v && l==b.l && r<b.r);
}
};
map<Node,int> h[10000000];
int cnt;
int ID(Node u){
int hash=((long long)u.v*100000000000000+(long long)u.l*10000000+u.r)%9999999;
if(h[hash].count(u))
return h[hash][u];
return h[hash][u]=cnt++;
}
void dfs(int u,int &subtreesize){
subtreesize=1; int x;
if(lid[u]==-1 && rid[u]==-1){
Node nd(value[u],-1,-1);
id[u]=mid[u]=ID(nd);
return;
}
Node nd(value[u]),mnd(value[u]);
if(lid[u]!=-1){ dfs(lid[u],x); subtreesize+=x; }
if(rid[u]!=-1){ dfs(rid[u],x); subtreesize+=x; }
if(lid[u]!=-1){ nd.l=id[lid[u]]; mnd.r=mid[lid[u]]; }
if(rid[u]!=-1){ nd.r=id[rid[u]]; mnd.l=mid[rid[u]]; }
id[u]=ID(nd); mid[u]=ID(mnd);
if(nd.l==mnd.l && nd.r==mnd.r)
ans=max(ans,subtreesize);
}
int main(){
int n;
cin>>n;
value.resize(n); id.resize(n); mid.resize(n);
lid.resize(n); rid.resize(n);
for(int i=0;i<n;i++)
cin>>value[i];
for(int i=0;i<n;i++){
cin>>lid[i]>>rid[i];
if(lid[i]>0) lid[i]--;
if(rid[i]>0) rid[i]--;
}
int t; dfs(0,t);
if(ans>0) cout<<ans;
else cout<<1;
return 0;
}