#include <cstdio>
#include <algorithm>
using namespace std;
const int N = (int)1e6 + 1;
int n, ans[N], len, p[N], s[N];
struct TreeNode {
int v;
int l, r;
} a[N];
int calc(int i) {
if (a[i].l < 0 && a[i].r < 0)
s[i] = 1;
else if (a[i].l < 0)
s[i] = calc(a[i].r) + 1;
else if (a[i].r < 0)
s[i] = calc(a[i].l) + 1;
else
s[i] = calc(a[i].l) + calc(a[i].r) + 1;
return s[i];
}
inline void dfs(int i) {
if (a[i].l > 0)
dfs(a[i].l);
else
ans[++len] = a[i].l;
ans[++len] = a[i].v;
p[i] = len;
if (a[i].r > 0)
dfs(a[i].r);
else
ans[++len] = a[i].r;
}
int dfs2(int l, int i, int r) {
int ll = 0;
int L = l, R = r;
while (ans[L + 1] == ans[R - 1] && L != R)
L++, R--;
if (L == R && L == p[i])
return s[i];
if (a[i].l > 0 && a[i].r > 0)
ll = max(dfs2(l, a[i].l, p[i] - 1), dfs2(p[i] + 1, a[i].r, r));
else if (a[i].l > 0)
ll = dfs2(l, a[i].l, p[i] - 1);
else if (a[i].r > 0)
ll = dfs2(p[i] + 1, a[i].r, r);
else
ll = 1;
return ll;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i].v);
for (int i = 1; i <= n; i++)
scanf("%d%d", &a[i].l, &a[i].r);
calc(1);
dfs(1);
printf("%d\n", dfs2(1, 1, len));
return 0;
}