#include <bits/stdc++.h>
using namespace std;
using ld = long double;
using ll = long long;
const int INF = 1e9, MOD = 1e9 + 7;
void solve();
signed main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
int q = 1;
while (q--) {
solve();
}
}
vector<vector<ll>> g;
void fnd(ll v, ll t, ll p, vector<ll>& path) {
if (path.empty() || path.back() != t) {
path.push_back(v);
}
for (auto u : g[v]) {
if (u != p) {
fnd(u, t, v, path);
}
}
if (path.empty() || path.back() != t) {
path.pop_back();
}
}
void solve() {
ll n; cin >> n;
vector<ll> p(n), val(n);
for (int i = 0; i < n; i++) {
ll x; cin >> x; x--;
p[x] = i;
val[i] = x;
}
g.resize(n);
for (int i = 1; i < n; i++) {
ll a, b; cin >> a >> b;
a--, b--;
g[a].push_back(b);
g[b].push_back(a);
}
vector<ll> dp(n, -INF);
dp[n - 1] = 0;
for (ll i = n - 2; i >= 0; i--) {
for (ll j = i + 1; j < n; j++) {
vector<ll> z;
fnd(p[j], p[i], -1, z);
ll mx = -1;
for (ll x = 1; x < z.size(); x++) {
mx = max(mx, val[z[x]]);
}
if (mx == i) {
dp[i] = max(dp[i], dp[j] + (int)z.size() - 1);
}
}
}
ll ans = 0;
for (int i = 0; i < n; i++) {
ans = max(ans, dp[i]);
}
cout << ans;
}