func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 100005;   vector<int> graph[MAXN];   int values[MAXN];   long long dp[MAXN];   int leftValue[MAXN];   priority_queue<pair<long long, int>, vector<pair<long long, int> >,                  greater<pair<long long, int> > >       pq;   void dfs(int u, int prev) {     for (int v : graph[u]) {       if (v == prev || values[v] == 0) {         continue;       }       values[v]--;       dfs(v, u);     }     while (!pq.empty()) {       pq.pop();     }     for (int v : graph[u]) {       if (v == prev) {         continue;       }       pq.push({dp[v], v});     }     int currentLeft = values[u];     while (!pq.empty()) {       if (pq.size() <= values[u]) {         dp[u] += pq.top().first + 1;         values[pq.top().second] = leftValue[pq.top().second];         currentLeft--;       }       pq.pop();     }     for (int v : graph[u]) {       if (v == prev || values[v] == 0) {         continue;       }       int pick = min(currentLeft, values[v]);       currentLeft -= pick;       values[v] -= pick;       dp[u] += 2 * pick;     }     dp[u]++;     leftValue[u] = currentLeft;   }   int main() {     cin.sync_with_stdio(false);     cin.tie(0);     int n;     cin >> n;     for (int i = 1; i <= n; i++) {       cin >> values[i];     }     for (int i = 1; i < n; i++) {       int in, out;       cin >> in >> out;       graph[in].push_back(out);       graph[out].push_back(in);     }     int root;     cin >> root;     dfs(root, -1);     cout << dp[root] - 1 << endl;     cin.get();     cin.get();     return 0;   }   