#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#define N 300000
struct E {
int i, j, a;
} ee[N * 2];
int aa[N], ii[N];
int compare1(const void *a, const void *b) {
int *ia = (int *) a;
int *ib = (int *) b;
int i = *ia;
int j = *ib;
return aa[j] != aa[i] ? aa[j] – aa[i] : i – j;
}
int compare2(const void *a, const void *b) {
struct E *pa = (struct E *) a;
struct E *pb = (struct E *) b;
return pa->i != pb->i ? pa->i – pb->i
: (pa->a != pb->a ? pb->a – pa->a : pa->j – pb->j);
}
int main() {
int n, m, g, h, i, j, min, max;
scanf(“%d”, &n);
for (i = 0; i < n; i++) {
scanf(“%d”, &aa[i]);
ii[i] = i;
}
if (n == 1) {
printf(“%d\n”, aa[0]);
return 0;
}
qsort(ii, n, sizeof *ii, compare1);
for (h = 0; h < n – 1; h++) {
struct E *e0, *e1;
scanf(“%d%d”, &i, &j);
i–, j–;
e0 = &ee[h * 2 + 0];
e1 = &ee[h * 2 + 1];
e0->i = i, e0->j = j, e0->a = aa[j];
e1->i = j, e1->j = i, e1->a = aa[i];
}
m = (n – 1) * 2;
qsort(ee, m, sizeof *ee, compare2);
min = INT_MAX;
for (h = 0, i = 0; h < m; i++) {
max = aa[i];
g = h;
j = 0;
while (g < m && ee[g].i == i) {
if (max < aa[ee[g].j] + 1)
max = aa[ee[g].j] + 1;
while (j < n && (ii[j] == ee[g].j || ii[j] == i))
j++;
g++;
}
if (j < n && max < aa[ii[j]] + 2)
max = aa[ii[j]] + 2;
if (min > max)
min = max;
h = g;
}
printf(“%d\n”, min);
return 0;
}