func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 200010;   vector<int> g[maxn + 1];   int father[maxn + 1], a[maxn + 1];   int f[maxn + 1], fup[maxn + 1];   int n, K;   int result;   int ge[maxn + 1], upge[maxn + 1];   int MIN;   void init() {     int i, x, y;     scanf( %d%d , &n, &K);     for (i = 1; i <= n; ++i) scanf( %d , &a[i]);     for (i = 1; i < n; ++i) {       scanf( %d%d , &x, &y);       g[x].push_back(y);       g[y].push_back(x);     }   }   void calc_ge(int p, int fa) {     int i, j;     father[p] = fa;     ge[p] = 1;     for (i = 0; i < g[p].size(); ++i) {       j = g[p][i];       if (j != fa) {         calc_ge(j, p);         ge[p] += ge[j];       }     }   }   void calc_f(int p) {     int i, j, zd = 0, sum = 0;     if ((g[p].size() == 1) && (father[p] == g[p][0])) {       if (a[p] >= MIN)         f[p] = 1;       else         f[p] = 0;       return;     }     if (a[p] < MIN) {       f[p] = 0;       for (i = 0; i < g[p].size(); ++i) {         j = g[p][i];         if (j != father[p]) calc_f(j);       }       return;     }     for (i = 0; i < g[p].size(); ++i) {       j = g[p][i];       if (j != father[p]) {         calc_f(j);         if (f[j] == ge[j])           sum += f[j];         else {           if (f[j] > zd) zd = f[j];         }       }     }     f[p] = 1 + sum + zd;   }   void calc_fup(int p) {     int i, j, zd = 0, zd2 = 0, sum = 0;     if ((g[p].size() == 1) && (father[p] == g[p][0])) return;     if (a[p] < MIN) {       for (i = 0; i < g[p].size(); ++i) {         j = g[p][i];         if (j != father[p]) {           fup[j] = 0;           calc_fup(j);         }       }       return;     }     if (fup[p] == upge[p])       sum = fup[p];     else       zd = fup[p];     for (i = 0; i < g[p].size(); ++i) {       j = g[p][i];       if (j != father[p]) {         if (f[j] == ge[j])           sum += f[j];         else {           if (f[j] > zd) {             zd2 = zd;             zd = f[j];           } else if (f[j] > zd2)             zd2 = f[j];         }       }     }     for (i = 0; i < g[p].size(); ++i) {       j = g[p][i];       if (j != father[p]) {         if (f[j] == ge[j])           fup[j] = 1 + sum - f[j] + zd;         else if (f[j] == zd)           fup[j] = 1 + sum + zd2;         else           fup[j] = 1 + sum + zd;       }     }     for (i = 0; i < g[p].size(); ++i) {       j = g[p][i];       if (j != father[p]) calc_fup(j);     }   }   bool ky(int now) {     int p, i, j, sum, zd;     MIN = now;     calc_f(1);     fup[1] = 0;     calc_fup(1);     for (p = 1; p <= n; ++p) {       sum = zd = 0;       if (fup[p] == upge[p])         sum = fup[p];       else         zd = fup[p];       if (a[p] < MIN) continue;       for (i = 0; i < g[p].size(); ++i) {         j = g[p][i];         if (j != father[p]) {           if (f[j] == ge[j])             sum += f[j];           else {             if (f[j] > zd) zd = f[j];           }         }       }       if (1 + sum + zd >= K) return true;     }     return false;   }   void work() {     int i, start, stop, mid;     father[1] = 0;     calc_ge(1, 0);     for (i = 1; i <= n; ++i) upge[i] = n - ge[i];     start = 1;     stop = 1000010;     while (start <= stop) {       mid = (start + stop) / 2;       if (ky(mid)) {         result = mid;         start = mid + 1;       } else         stop = mid - 1;     }   }   void output() { printf( %d n , result); }   int main() {     init();     work();     output();     return 0;   }   