func_code_string: #include <bits/stdc++.h>   #pragma GCC optimize( Ofast )   using namespace std;   const int N = 5e5 + 2;   int seg[N * 4];   int lazy[N * 4];   int hi[N];   int h[N];   int n;   vector<int> g[N];   vector<int> y[N];   pair<int, int> t[N];   void dfs(int v, int p) {     t[v] = t[p];     if (hi[t[v].second] > hi[v]) {       t[v].second = v;     }     if (hi[t[v].second] < hi[t[v].first]) swap(t[v].second, t[v].first);     for (auto &u : g[v]) {       if (u == p) continue;       dfs(u, v);     }   }   void upd(int nod, int l, int r, int L, int R, int val) {     if (l >= R || L >= r) return;     if (l >= L && r <= R) {       seg[nod] += val;       lazy[nod] += val;       return;     }     int mid = (r + l) >> 1;     upd(nod << 1, l, mid, L, R, val);     upd(nod << 1 | 1, mid, r, L, R, val);     seg[nod] = min(seg[nod << 1], seg[nod << 1 | 1]) + lazy[nod];   }   inline bool check(int v, int val) {     for (auto &u : y[v]) {       int x = hi[t[u].first];       int y = min(hi[t[u].second], hi[t[u].first] + val);       int z = upper_bound(h + 1, h + n + 1, x) - h;       int e = upper_bound(h + 1, h + n + 1, y) - h;       upd(1, 1, N, z, e, +1);     }     bool p1 = 0;     if (seg[1] >= 0) p1 = 1;     for (auto &u : y[v]) {       int x = hi[t[u].first];       int y = min(hi[t[u].second], hi[t[u].first] + val);       int z = upper_bound(h + 1, h + n + 1, x) - h;       int e = upper_bound(h + 1, h + n + 1, y) - h;       upd(1, 1, N, z, e, -1);     }     return p1;   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     scanf( %d , &n);     for (int i = 1; i <= n; i++) {       scanf( %d , &hi[i]);     }     for (int i = 0; i < n - 1; i++) {       int u, v;       scanf( %d%d , &u, &v);       g[u].push_back(v);       g[v].push_back(u);     }     int k;     scanf( %d , &k);     for (int i = 1; i <= k; i++) {       scanf( %d , &h[i]);     }     sort(h + 1, h + n + 1);     for (int i = n; i; i--) {       upd(1, 1, N, 1, i + 1, -1);     }     hi[0] = 1e9 + 100;     t[0] = {0, 0};     dfs(1, 0);     for (int i = 1; i <= n; i++) {       y[t[i].first].push_back(i);       int z = upper_bound(h + 1, h + n + 1, hi[t[i].first]) - h;       upd(1, 1, N, 1, z, +1);     }     int l1 = -1, r1 = 1e9 + 2;     for (int i = 1; i <= n; i++) {       int l = -1, r = r1;       if (!(check(i, r - 1))) continue;       while (r - l > 1) {         int mid = (r + l) / 2;         int z = check(i, mid);         if (z)           r = mid;         else           l = mid;       }       r1 = r;     }     if (r1 > 1e9) {       printf( %d , -1);       return 0;     }     printf( %d , r1);   }   