#include <bits/stdc++.h>
const int N = 6060;
int a[N], d1[N], d2[N], h[N], s[N], e[N], p[N], val[N * 2], lnk[N * 2], n, i, j,
    m, v;
bool b[N];
inline void gor(int k, int pa) {
  if (!b[k]) {
    p[k] = pa;
    s[k] = ++v;
    b[k] = 1;
    for (int i = h[k]; i > 0; i = lnk[i])
      if (!b[val[i]]) gor(val[i], k);
    e[k] = ++v;
  }
}
inline void go(int k) {
  if (!b[k]) {
    b[k] = 1;
    for (int i = h[k]; i > 0; i = lnk[i])
      if (!b[val[i]]) go(val[i]);
    d1[k] = d2[k] = 1;
    for (int i = 0; i < n; i++)
      if (s[k] < s[i] && e[k] > e[i]) {
        if (a[k] > a[i] && d1[i] + 1 > d1[k]) d1[k] = d1[i] + 1;
        if (a[k] < a[i] && d2[i] + 1 > d2[k]) d2[k] = d2[i] + 1;
      }
    if (d1[k] > m) m = d1[k];
    if (d2[k] > m) m = d2[k];
  }
}
int main() {
  scanf("%d", &n);
  for (i = 0; i < n; i++) scanf("%d", &a[i]);
  for (i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    --x, --y;
    val[i] = y;
    lnk[i] = h[x];
    h[x] = i;
    val[i + n] = x;
    lnk[i + n] = h[y];
    h[y] = i + n;
  }
  gor(0, -1);
  for (i = 0; i < n; i++) b[i] = 0;
  go(0);
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
      if ((s[i] > e[j] || s[j] > e[i]) && a[i] < a[j]) {
        int t = d1[i] + d2[j];
        if (p[i] >= 0 && a[p[i]] > a[i] && a[p[i]] < a[j]) ++t;
        if (t > m) m = t;
      }
  printf("%d\n", m);
  return 0;
}
