func_code_string: #include <bits/stdc++.h>   using namespace std;   struct query {     int Q, id;     long long res;   };   const int Nmax = 200001;   int n, m, parent[Nmax], Rank[Nmax];   vector<pair<int, pair<int, int> > > edge;   bool cmpQ(const query &q1, const query &q2) { return q1.Q < q2.Q; }   bool ret(const query &q1, const query &q2) { return q1.id < q2.id; }   int Find(const int &i) {     if (i == parent[i]) return i;     return parent[i] = Find(parent[i]);   }   void Union(const int &i, const int &j) {     int x = Find(i), y = Find(j);     if (x != y) {       if (Rank[x] > Rank[y]) {         parent[y] = x;         Rank[x] += Rank[y];       } else {         parent[x] = y;         Rank[y] += Rank[x];       }     }   }   int main() {     if (fopen( 1213G                 .INP ,                r )) {       freopen(            1213G             .INP ,            r , stdin);       freopen(            1213G             .OUT ,            w , stdout);     }     ios_base::sync_with_stdio(false);     cin.tie(NULL);     scanf( %d %d , &n, &m);     for (int i = 1, _n = (n); i <= _n; ++i) parent[i] = i, Rank[i] = 1;     edge.resize(n - 1);     int u, v, w, q;     for (int i = 0, _n = (n - 1); i < _n; ++i)       scanf( %d %d %d , &edge[i].second.first, &edge[i].second.second,             &edge[i].first);     sort(edge.begin(), edge.end());     vector<query> qu(m);     for (int i = 0, _n = (m); i < _n; ++i) {       scanf( %d , &qu[i].Q);       qu[i].id = i;     }     sort(qu.begin(), qu.end(), cmpQ);     int j = 0;     long long ans = 0;     for (int i = 0, _n = (m); i < _n; ++i) {       for (; j < n - 1; ++j) {         if (edge[j].first <= qu[i].Q) {           ans += (long long)Rank[Find(edge[j].second.first)] *                  Rank[Find(edge[j].second.second)];           Union(edge[j].second.first, edge[j].second.second);         } else           break;       }       qu[i].res = ans;     }     sort(qu.begin(), qu.end(), ret);     for (int i = 0, _n = (m); i < _n; ++i) cout << qu[i].res <<    ;     return 0;   }   