#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 1<<18;
vector<int> nei[N];
int Par[N][20], hei[N], p[N], pr[N];
vector<pair<int, pair<int, int>>> E;
long long Ans[N];
void dfs(int u, int p){
hei[u] = hei[p] + 1;
Par[u][0] = p;
for (int i=0;i<18;i++)
Par[u][i+1] = Par[Par[u][i]][i];
for (int i : nei[u])
if (i != p)
dfs(i, u);
}
int LCA(int u, int v){
if (hei[u] > hei[v])
swap(u, v);
for (int i=18;i + 1;i--){
if (hei[u] + (1<<i) <= hei[v])
v = Par[v][i];
}
for (int i=18;i + 1;i--){
if (Par[u][i] != Par[v][i])
u = Par[u][i], v = Par[v][i];
}
return hei[u] - (u != v);
}
int dst(int u, int v){
return hei[u] + hei[v] - 2 * LCA(u, v);
}
int root(int v){
return (pr[v] == 0 ? v : pr[v] = root(pr[v]));
}
int main(){
int n;
cin>>n;
for (int i=1;i<=n;i++)
cin>>p[i];
for (int i=1;i<n;i++){
int a, b;
cin>>a>>b;
if (p[a] < p[b])
swap(a, b);
nei[a].push_back(b);
nei[b].push_back(a);
E.push_back({p[a], {a, b}});
}
dfs(1, 0);
sort(begin(E), end(E));
for (auto [c, ab] : E){
auto [a, b] = ab;
b = root(b);
Ans[a] = max(Ans[a], Ans[b] + dst(a, b));
pr[b] = a;
}
cout<<Ans[root(1)]<<endl;
}