func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 1e5 + 10, inf = 15e8;   int A[maxn], B[maxn], C[maxn], ANSA, ANSB, n, l, r;   vector<int> ed;   vector<pair<int, int> > v[maxn];   int SZ[maxn], MX;   bool mark[maxn];   pair<int, int> val[2 * maxn];   void dfsS(int u, int par = -1) {     SZ[u] = 1;     for (pair<int, int> p : v[u]) {       if (p.first != par && !mark[p.first])         dfsS(p.first, u), SZ[u] += SZ[p.first];     }   }   int dfsC(int u, int ss, int par = -1) {     for (pair<int, int> p : v[u]) {       if (p.first != par && !mark[p.first] && SZ[p.first] >= ss)         return dfsC(p.first, ss, u);     }     return u;   }   void prep() {     for (int i = 0; i < 2 * MX; i++) {       val[i] = {-inf, -inf};     }   }   pair<int, int> ask(int f, int s) {     s = min(s, MX - 1);     f += MX;     s += MX;     pair<int, int> ans = {-inf, -inf};     while (f < s) {       if (f & 1) ans = max(ans, val[f++]);       if (s & 1) ans = max(ans, val[--s]);       f >>= 1;       s >>= 1;     }     return ans;   }   void add(int pos, pair<int, int> p) {     pos += MX;     while (pos > 0) {       val[pos] = max(val[pos], p);       pos >>= 1;     }   }   void dfsadd(int u, int ln, int sm, int par) {     add(ln, {sm, u});     for (pair<int, int> p : v[u]) {       if (p.first != par && !mark[p.first])         dfsadd(p.first, ln + 1, sm + p.second, u);     }   }   void dfsask(int u, int ln, int sm, int par) {     pair<int, int> X = ask(max(0, l - ln), max(0, r - ln + 1));     if (X.first + sm >= 0) ANSA = X.second, ANSB = u;     for (pair<int, int> p : v[u]) {       if (p.first != par && !mark[p.first])         dfsask(p.first, ln + 1, sm + p.second, u);     }   }   void solve(int u) {     dfsS(u);     MX = SZ[u] + 5;     prep();     u = dfsC(u, SZ[u] / 2);     add(0, {0, u});     mark[u] = 1;     for (pair<int, int> p : v[u]) {       if (!mark[p.first])         dfsask(p.first, 1, p.second, u), dfsadd(p.first, 1, p.second, u);     }     for (pair<int, int> p : v[u]) {       if (!mark[p.first]) solve(p.first);     }   }   bool okay(int num) {     memset(mark, 0, sizeof mark);     for (int i = 1; i <= n; i++) {       v[i].clear();     }     for (int i = 0; i < n - 1; i++) {       v[A[i]].push_back({B[i], C[i] >= ed[num] ? 1 : -1});       v[B[i]].push_back({A[i], C[i] >= ed[num] ? 1 : -1});     }     ANSA = ANSB = -1;     solve(1);     return ANSA != -1;   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cin >> n >> l >> r;     for (int i = 0; i < n - 1; i++) {       cin >> A[i] >> B[i] >> C[i];       ed.push_back(C[i]);     }     sort(ed.begin(), ed.end());     int l = 0, r = n - 2, ansa = -1, ansb = -1;     while (l <= r) {       int mid = (l + r) / 2;       if (okay(mid))         ansa = ANSA, ansb = ANSB, l = mid + 1;       else         r = mid - 1;     }     cout << ansa <<     << ansb << endl;     return 0;   }   