#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
inline int read()
{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
return x*f;
}
const int N=2e4+10;
struct qwq{
int to,ne;
}t[N];
int elast[N],num;
void add(int from,int to)
{
t[++num]={to,elast[from]};
elast[from]=num;
}
int n;
int a[N];
int f[N],len;
void dfs(int x,int fa)
{
if(a[x]>f[len])f[++len]=a[x];
else
{
int pos=lower_bound(f+1,f+1+n,a[x])-f;
f[pos]=a[x];
}
for(int i=elast[x];i;i=t[i].ne)
if(t[i].to!=fa)dfs(t[i].to,x);
}
int main()
{
n=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<n;i++)
{
int x=read(),y=read();
add(x,y),add(y,x);
}
int ans=0;
for(int i=1;i<=n;i++)
{
memset(f,0,sizeof(f)),len=0;
dfs(i,0),ans=max(ans,len);
}
printf("%d\n",ans);
return 0;
}