func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, L, R;   int a, b;   int lo = -1, hi = 1e9 + 1;   const int MAXN = 111111;   const int INF = 1e9;   vector<pair<int, int> > adj[MAXN];   int sz[MAXN], chk[MAXN];   int q[MAXN], f[MAXN], g[MAXN], d[MAXN], h[MAXN];   void dfs(int u, int p) {     sz[u] = 1;     for (int i = 0; i < adj[u].size(); i++) {       int v = adj[u][i].first;       if (v != p) {         dfs(v, u);         sz[u] += sz[v];       }     }   }   int get_center(int u) {     int s = sz[u];     while (1) {       int r = 0;       for (int i = 0; i < adj[u].size(); i++) {         int v = adj[u][i].first;         if (chk[v]) continue;         if (sz[v] > sz[r]) r = v;       }       if (sz[r] <= s / 2) return u;       sz[u] = s - sz[r], u = r;     }   }   bool cmp(pair<int, int> a, pair<int, int> b) {     return sz[a.first] < sz[b.first];   }   void go(int u, int p, int mid, int s) {     f[u] = s, d[u] = d[p] + 1;     if (d[u] > R) return;     if (f[h[d[u]]] < s) h[d[u]] = u;     for (int i = 0; i < adj[u].size(); i++) {       int v = adj[u][i].first;       if (v == p || chk[v]) continue;       go(v, u, mid, s + (adj[u][i].second >= mid ? 1 : -1));     }   }   bool check(int u, int mid, int &x, int &y) {     f[u] = d[u] = 0, f[0] = -INF, g[0] = u;     for (int j = 1; j <= R && j <= sz[u]; j++) g[j] = 0;     for (int i = 0; i < adj[u].size(); i++) {       int v = adj[u][i].first;       if (chk[v]) continue;       for (int j = 1; j <= R && j <= sz[v]; j++) h[j] = 0;       go(v, u, mid, (adj[u][i].second >= mid ? 1 : -1));       int head = 0, tail = 0;       for (int j = 1, k = min(sz[v], R - 1); j <= min(R, sz[v]); j++) {         if (h[j] == 0) break;         for (; k >= max(0, L - j); k--) {           if (g[k] == 0) continue;           while (head < tail && f[g[q[tail - 1]]] <= f[g[k]]) tail--;           q[tail++] = k;         }         while (head < tail && q[head] > R - j) head++;         if (head < tail && f[g[q[head]]] + f[h[j]] >= 0) {           x = g[q[head]], y = h[j];           return 1;         }       }       for (int j = 1; j <= min(R, sz[v]); j++)         if (f[g[j]] < f[h[j]]) g[j] = h[j];     }     return 0;   }   void process(int u) {     sort((adj[u]).begin(), (adj[u]).end(), cmp);     hi = 1e9 + 1;     int x = 0, y = 0;     while (hi - lo > 1) {       int mid = lo + hi >> 1;       if (check(u, mid, x, y))         a = x, b = y, lo = mid;       else         hi = mid;     }   }   void solve(int u) {     u = get_center(u);     process(u), chk[u] = 1;     for (int i = 0; i < adj[u].size(); i++) {       int v = adj[u][i].first;       if (!chk[v]) solve(v);     }   }   int main() {     cin >> n >> L >> R;     for (int i = 1; i < n; i++) {       int u, v, w;       scanf( %d%d%d , &u, &v, &w);       adj[u].push_back(make_pair(v, w));       adj[v].push_back(make_pair(u, w));     }     dfs(1, 0);     solve(1);     printf( %d %d n , a, b);     return 0;   }   