func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1e5 + 5, INF = N;   int n, L, R, ANS_U, ANS_V, ANS;   struct st {     int nxt, to, w, dis;   } ed[N << 1];   int head[N], num;   void add(int from, int to, int w) {     ed[++num].to = to, ed[num].w = w;     ed[num].nxt = head[from];     head[from] = num;   }   int sum, rt, siz[N], mx[N];   bool vis[N];   void getrt(int x, int fa) {     mx[x] = 0;     for (int u, i = head[x]; i; i = ed[i].nxt) {       u = ed[i].to;       if (u == fa || vis[u]) continue;       getrt(u, x), mx[x] = max(mx[x], siz[u]);     }     mx[x] = max(mx[x], sum - siz[x]);     if (mx[x] < mx[rt]) rt = x;   }   int mxd[N], V[N];   vector<int> E[N];   void dfs_init(int x, int fa) {     mxd[x] = 0, siz[x] = 1;     for (int u, i = head[x]; i; i = ed[i].nxt) {       u = ed[i].to;       if (vis[u] || u == fa) continue;       dfs_init(u, x), mxd[x] = max(mxd[x], mxd[u] + 1), siz[x] += siz[u];     }   }   bool cmp(int a, int b) { return mxd[a] < mxd[b]; }   void work(int x) {     dfs_init(x, 0);     int h = 0;     for (int i = head[x]; i; i = ed[i].nxt)       if (!vis[ed[i].to]) V[++h] = ed[i].to;     sort(V + 1, V + 1 + h, cmp);     for (int i = 1; i <= h; i++) E[x].push_back(V[i]);   }   void solve_init(int x) {     work(x), vis[x] = 1;     for (int u, i = head[x]; i; i = ed[i].nxt) {       u = ed[i].to;       if (vis[u]) continue;       rt = 0, sum = siz[u], getrt(u, x), solve_init(rt);     }   }   int f[N], a[N], s[N], id_a[N], id_s[N], ans_u, ans_v, ans;   void dfs(int x, int fa, int dep) {     if (f[x] > a[dep]) a[dep] = f[x], id_a[dep] = x;     for (int u, i = head[x]; i; i = ed[i].nxt) {       u = ed[i].to;       if (vis[u] || u == fa) continue;       f[u] = f[x] + ed[i].dis, dfs(u, x, dep + 1);     }   }   int q[N], hd, tail;   void calc(int x) {     dfs_init(x, 0);     int len = 0;     for (int i = head[x]; i; i = ed[i].nxt)       if (!vis[ed[i].to]) f[ed[i].to] = ed[i].dis, ++mxd[ed[i].to];     for (int i = 0; i <= mxd[x]; i++) s[i] = -N;     s[0] = 0, id_s[0] = x;     for (auto u : E[x]) {       if (vis[u]) continue;       for (int i = 0; i <= mxd[u]; i++) a[i] = -N;       a[0] = 0, id_a[0] = x;       dfs(u, x, 1), hd = 1, tail = 0;       if (L <= len)         for (int i = min(R, len); i > L; i--) {           while (hd <= tail && s[q[tail]] <= s[i]) --tail;           q[++tail] = i;         }       for (int i = 0; i <= mxd[u]; i++) {         while (hd <= tail && q[hd] > R - i) ++hd;         if (len >= L - i && L - i >= 0) {           while (hd <= tail && s[L - i] >= s[q[tail]]) --tail;           q[++tail] = L - i;         }         if (hd <= tail && s[q[hd]] + a[i] > ans)           ans = s[q[hd]] + a[i], ans_u = id_a[i], ans_v = id_s[q[hd]];       }       for (int i = 0; i <= mxd[u]; i++)         if (a[i] > s[i]) s[i] = a[i], id_s[i] = id_a[i];       len = max(len, mxd[u]);     }   }   void solve(int x) {     calc(x), vis[x] = 1;     for (int u, i = head[x]; i; i = ed[i].nxt) {       u = ed[i].to;       if (vis[u]) continue;       rt = 0, sum = siz[u], getrt(u, x), solve(rt);     }   }   int main() {     int u, v, w, l = 0, r = 0;     scanf( %d%d%d , &n, &L, &R);     for (int i = 1; i < n; i++)       scanf( %d%d%d , &u, &v, &w), add(u, v, w), add(v, u, w), r = max(r, w);     mx[0] = N, rt = 0, sum = n, getrt(1, 0), solve_init(rt);     while (l <= r) {       int mid = (l + r) >> 1;       for (int i = 1; i <= num; i++) ed[i].dis = (ed[i].w >= mid) ? 1 : -1;       for (int i = 1; i <= n; i++) vis[i] = 0;       mx[0] = N, ans = -N, rt = 0, sum = n, getrt(1, 0), solve(rt);       if (ans >= 0)         ANS_U = ans_u, ANS_V = ans_v, ANS = mid, l = mid + 1;       else         r = mid - 1;     }     printf( %d %d n , ANS_U, ANS_V);     return 0;   }   