RT
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int N = 6010;
long long n, a[N], f[N], ans, k, u, v, tmp, head[N], tot;
struct edge {
int to, nxt;
}; edge g[N << 1];
template<typename T>
inline void read(T& x)
{
x = 0;
register int f = 1;
register char c = getchar();
while (c < '0' || c>'9')
{
if (c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
{
x = (x << 3) + (x << 1) + (c ^ 48);
c = getchar();
}
x *= f;
}
template<typename T>
void write(T x)
{
if (x < 0)
{
putchar('-');
x = ~x + 1;
}
if (x >= 10) write(x / 10);
putchar(x % 10 ^ 48);
}
inline void add(int u, int v)
{
g[++tot].to = v;
g[tot].nxt = head[u];
head[u] = tot;
}
void dfs(int o, int fa)
{
k = lower_bound(f + 1, f + n + 1, a[o]) - f;
ans = max(ans, k); tmp = f[k]; f[k] = a[o];
for (int i = head[o]; i; i = g[i].nxt)
{
v = g[i].to;
if (v != fa) dfs(v, o);
}
f[k] = tmp;
}
int main()
{
read(n);
for (int i = 1; i <= n; ++i)
read(a[i]);
for (int i = 1; i < n; ++i)
{
read(u); read(v);
add(u, v);
add(v, u);
}
memset(f, 0x3f3f3f3f, sizeof(f));
for (int i = 1; i <= n; ++i)
dfs(i, 0);
write(ans);
return 0;
}