func_code_string: #include <bits/stdc++.h>   using namespace std;   const int nax = 2 * (int)1e5 + 10;   const int INF = (int)1e9 + 47;   vector<int> g[nax];   int n, k;   int lvl[nax], tin[nax], tout[nax];   int cnt = 0;   int timer = 0;   int ver[nax];   int seen[nax];   int par[nax];   int vr[nax];   vector<pair<int, int>> vec;   void dfs(int v, int p = -1) {     if (p != -1) lvl[v] = lvl[p] + 1;     vec.push_back({lvl[v], v});     par[v] = p;     if (g[v].size() == 1 && p != -1) cnt++;     if (p != -1) lvl[v] = lvl[p] + 1;     for (auto to : g[v]) {       if (to == p) continue;       dfs(to, v);     }   }   long long f(int red, int blue) {     int w = n - red - blue;     return w * 1ll * (red - blue);   }   int main() {     ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);     cin >> n >> k;     for (int i = 0; i < n - 1; i++) {       int a, b;       cin >> a >> b;       --a, --b;       g[a].push_back(b);       g[b].push_back(a);     }     dfs(0);     sort(vec.begin(), vec.end(), greater<pair<int, int>>());     vector<int> vv;     for (int i = 0; i < n; i++) {       int cur = vec[i].second;       int cc = 0;       while (cur != -1 && !seen[cur]) {         cc++;         seen[cur] = 1;         cur = par[cur];       }       vv.push_back(cc);     }     sort(vv.begin(), vv.end(), greater<int>());     int blue = n;     long long best_ans = -(long long)1e18;     for (int i = 0; i < min(k, cnt); i++) {       blue -= vv[i];       int l = 0, r = blue;       for (int it = 0; it < 40; it++) {         int mid = (l + r) / 2;         if (f(i + 1, mid + 1) <= f(i + 1, mid))           l = mid;         else           r = mid;       }       if ((f(i + 1, r) > f(i + 1, r + 1) && r + 1 < blue) ||           (f(i + 1, r - 1) < f(i + 1, r) && r - 1 >= 0))         throw 47;       best_ans = max(best_ans, f(i + 1, r));     }     while (cnt <= k) {       best_ans = max(best_ans, (n - cnt) * 1ll * cnt);       cnt++;     }     cout << best_ans <<   n ;   }   