func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAX = 1000007;   vector<int> edg[MAX];   int lvl[MAX];   multiset<int>* msets[MAX];   int k;   void mergesets(int frm, int to, int height) {     if (msets[frm]->size() > msets[to]->size()) {       swap(msets[frm], msets[to]);     }     height *= 2;     for (int x : *msets[frm]) {       int g = *(msets[to]->begin());       if (g + x - height > k) {         msets[to]->insert(x);         continue;       }       g = max(g, x);       msets[to]->erase(msets[to]->begin());       msets[to]->insert(g);     }     msets[frm]->clear();   }   void dfs(int u, int p = 0) {     lvl[u] = lvl[p] + 1;     msets[u] = new multiset<int>();     if (edg[u].size() == 1) {       msets[u]->insert(lvl[u]);     }     for (int v : edg[u]) {       if (v == p) continue;       dfs(v, u);       mergesets(v, u, lvl[u]);     }   }   int main() {     std::ios_base::sync_with_stdio(false);     cin.tie(0);     int n;     cin >> n >> k;     for (int i = 1; i < n; i++) {       int u, v;       cin >> u >> v;       edg[u].push_back(v);       edg[v].push_back(u);     }     int r = 1;     for (int i = 2; i <= n; i++) {       if (edg[i].size() > edg[r].size()) {         r = i;       }     }     dfs(r);     cout << msets[r]->size() << endl;     return 0;   }   