#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define pb push_back
const int N=2e5+5,MAXN=1e5+5,MAXA=1e6+5,inf=1e9,MOD=998244353;
int n,p[N],par[N],pos[N],up[N][20],depth[N],sol[N];
vector<int> adj[N];
int find(int x){
return par[x]=(par[x]==x?x:find(par[x]));
}
void dfs(int node,int pr=0,int d=0){
up[node][0]=pr;
depth[node]=d;
for(int i=1;i<20;i++)up[node][i]=up[up[node][i-1]][i-1];
for(auto i:adj[node]){
if(i!=pr)dfs(i,node,d+1);
}
}
int dist(int a,int b){
int ans=0;
if(depth[a]>depth[b])swap(a,b);
for(int i=19;i>=0;i--){
if(up[b][i]!=0 && depth[up[b][i]]>=depth[a]){
b=up[b][i];
ans+=(1<<i);
}
}
if(a==b)return ans;
for(int i=19;i>=0;i--){
if(up[a][i]!=0 && up[a][i]!=up[b][i]){
a=up[a][i]; b=up[b][i];
ans+=(1<<(i+1));
}
}
return ans+2;
}
signed main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>p[i];
pos[p[i]]=i;
par[i]=i;
}
for(int i=0;i<n-1;i++){
int u,v; cin>>u>>v;
adj[u].pb(v); adj[v].pb(u);
}
dfs(1);
for(int i=1;i<=n;i++){
int node=pos[i];
for(auto v:adj[node]){
if(i>p[v]){
v=find(v);
sol[node]=max(sol[node],sol[v]+dist(node,v));
par[v]=node;
}
}
}
cout<<sol[pos[n]];
}