func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXn = 1e5 + 10, MAXlg = 20;   long long dp[MAXn][MAXlg], h[MAXn], dp2[MAXn], n, m, dp3[MAXn], dp4[MAXn];   vector<int> v[MAXn];   bool flag[MAXn], flag2[MAXn];   int make_tree(int a) {     flag[a] = true;     int ans = 1;     h[a] = h[dp[a][0]] + 1;     if (v[a].size() == 1 && a != 1) {       dp2[a] = 1;       return ans;     }     for (int i = 0; i < v[a].size(); i++)       if (!flag[v[a][i]]) {         dp[v[a][i]][0] = a;         ans += make_tree(v[a][i]);         dp3[a] += dp3[v[a][i]];       }     dp3[a] += ans - 1;     dp2[a] = ans;     return ans;   }   void make_dp(int a) {     flag2[a] = true;     for (int i = 0; i < v[a].size(); i++)       if (!flag2[v[a][i]]) {         dp4[v[a][i]] = dp4[a] + (n - dp2[a]) + dp3[a] + (dp2[a] - dp2[v[a][i]]) -                        (dp3[v[a][i]] + dp2[v[a][i]]);         make_dp(v[a][i]);       }   }   void make_lca() {     for (int i = 1; i < MAXlg; i++)       for (int j = 1; j <= n; j++) dp[j][i] = dp[dp[j][i - 1]][i - 1];   }   long double get_lca(int a, int b) {     if (h[a] > h[b]) swap(a, b);     int aa = a, bb = b, cc = b;     long long dis = h[b] - h[a];     for (int i = 0; i < MAXlg; i++)       if ((dis >> i) & 1) b = dp[b][i];     if (a == b) {       long double ans = 0;       dis--;       for (int i = 0; i < MAXlg; i++)         if ((dis >> i) & 1) bb = dp[bb][i];       ans += (long double)(dp4[a] + dp3[a] - dp3[bb] - dp2[bb]) * dp2[cc];       ans += (long double)(dp3[cc]) * (n - dp2[bb]);       ans += (long double)(dis + 2) * (dp2[1] - dp2[bb]) * dp2[cc];       ans /= (long double)(dp2[1] - dp2[bb]) * dp2[cc];       return ans;     }     for (int i = MAXlg - 1; i >= 0; i--)       if (dp[a][i] != dp[b][i]) {         a = dp[a][i];         b = dp[b][i];       }     int lca = dp[a][0];     long double ans = 0;     ans += (long double)dp3[aa] * dp2[bb] + dp3[bb] * dp2[aa] +            (long double)((long double)-2 * h[lca] + h[aa] + h[bb] + 1) * dp2[aa] *                dp2[bb];     ans /= (long double)dp2[aa] * dp2[bb];     return ans;   }   int main() {     cin >> n >> m;     for (int i = 0; i < n - 1; i++) {       int a, b;       cin >> a >> b;       v[a].push_back(b);       v[b].push_back(a);     }     make_tree(1);     make_lca();     make_dp(1);     for (int i = 0; i < m; i++) {       int a, b;       cin >> a >> b;       cout << fixed << setprecision(10) << get_lca(a, b) << endl;     }   }   