#include<bits/stdc++.h>
using namespace std;
#define pk push_back
#define int long long
int n,dep[200005],up[200005][40],p[200005],dp[200005],fa[200005];
vector<int>f[200005];
void dfs(int x,int fa,int deep){
up[x][0]=fa,dep[x]=deep;
for(int i=0;i<f[x].size();i++)if(f[x][i]!=fa)dfs(f[x][i],x,deep+1);
}
void init(){
for(int i=1;i<=39;i++)for(int j=1;j<=n;j++)up[j][i]=up[up[j][i-1]][i-1];
}
int lca(int x,int y){
if(dep[x]<dep[y])swap(x,y);
for(int i=39;i>=0;i--)if(dep[up[x][i]]>=dep[y])x=up[x][i];
if(x==y)return y;
for(int i=39,x1=x,y1=y;i>=0;i--)if(up[x][i]!=up[y][i])x=up[x][i],y=up[y][i];
return up[x][0];
}
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
int dis(int x,int y){
return dep[x]+dep[y]-(dep[lca(x,y)]<<1);
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>p[i];
fa[i]=i;
}
for(int i=1,u,v,k,l;i<n;i++){
cin>>k>>l;
u=p[k],v=p[l];
f[u].pk(v),f[v].pk(u);
}
dfs(p[1],-1,1);
init();
for(int i=1;i<=n;i++){
for(int j=0;j<f[i].size();j++){
int v=find(f[i][j]);
if(v<i)fa[v]=i,dp[i]=max(dp[i],dp[v]+dis(i,v));
}
}
cout<<dp[n]<<'\n';
return 0;
}