#include <bits/stdc++.h>
using namespace std;
const int maxn = 6005, inf = 1e9 + 10;
int n, k, A[maxn];
vector<int> G[maxn];
struct LIS {
  int S[maxn], ans;
  vector<pair<int, int> > d;
  void build() {
    ans = 0;
    fill(S, S + maxn, inf);
  }
  void add(int x) {
    int pos = lower_bound(S, S + maxn, x) - S;
    d.push_back({pos, S[pos]});
    if (S[pos] == inf) ans++;
    S[pos] = x;
  }
  void undo() {
    int pos = d.back().first, x = d.back().second;
    d.pop_back();
    if (x == inf) ans--;
    S[pos] = x;
  }
} lis;
int ans = 0;
void dfs(int a, int p) {
  lis.add(A[a]);
  ans = max(ans, lis.ans);
  for (int b : G[a]) {
    if (b != p) {
      dfs(b, a);
    }
  }
  lis.undo();
}
int32_t main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d", A + i);
  }
  for (int i = 1; i < n; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    a--, b--;
    G[a].push_back(b);
    G[b].push_back(a);
  }
  for (int a = 0; a < n; a++) {
    if (G[a].size() == 1) {
      lis.build();
      dfs(a, a);
    }
  }
  printf("%d\n", ans);
}
