#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 2e5 + 5;
int st[4 * maxn], p[maxn];
vector<int> adj[maxn];
void build(int id, int l, int r){
if(l == r) st[id] = l;
else{
int mid = (l + r) / 2;
build(id * 2, l, mid);
build(id * 2 + 1, mid + 1, r);
if(p[st[id * 2]] > p[st[id * 2 + 1]]) st[id] = st[id * 2];
else st[id] = st[id * 2 + 1];
}
}
int get(int id, int l, int r, int u, int v){
if(v < l || r < u) return 0;
if(u <= l && r <= v) return st[id];
int mid = (l + r) / 2;
int lpos = get(id * 2, l, mid, u, v), rpos = get(id * 2 + 1, mid + 1, r, u, v);
return (p[lpos] > p[rpos]) ? lpos : rpos;
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n; cin >> n;
vector<int> deg(n + 1), a(n + 1);
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= n - 1; i++){
int u, v; cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
deg[u]++, deg[v]++;
}
int cur = 1, pre = 0;
for(int i = 1; i <= n; i++){
if(deg[i] == 1){
cur = i;
break;
}
}
for(int i = 1; i <= n; i++){
p[i] = a[cur];
for(int v: adj[cur]){
if(v != pre){
pre = cur;
cur = v;
break;
}
}
}
build(1, 1, n);
function<int(int, int)> solve = [&](int l, int r) -> int {
if(l >= r) return 0;
int mid = get(1, 1, n, l, r), ans = 0;
if(l < mid) ans = max(ans, mid - get(1, 1, n, l, mid - 1) + solve(l, mid - 1));
if(mid < r) ans = max(ans, get(1, 1, n, mid + 1, r) - mid + solve(mid + 1, r));
return ans;
};
cout << solve(1, n) << "\n";
}