func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1e5 + 10;   int n;   int L;   int R;   struct data {     int u;     int f;     int dis;     int dep;   };   queue<data> q1, q2;   struct ed {     int v;     int val;     int siz;     int ori;     friend bool operator<(ed a, ed b) { return a.siz < b.siz; }   };   vector<ed> v[N];   int ng[N];   int tim;   int nsiz[N];   int w[N];   int nu[N];   int siz[N];   bool cut[N];   int ans1;   int ans2;   struct dq {     int q[3 * N];     int hd;     int tl;     inline void clr() {       hd = 1;       tl = 0;     }     inline bool emp() { return hd <= tl; }     inline void ins(int j) {       while (hd <= tl && w[j] >= w[q[tl]]) tl--;       q[++tl] = j;     }     inline void del(int k) {       while (hd <= tl && q[hd] > k) hd++;     }     inline int qmx() { return q[hd]; }   } q;   inline void clear(queue<data>& q) {     queue<data> emp;     swap(q, emp);   }   inline int dfs1(int u, int f) {     siz[u] = 1;     for (vector<ed>::iterator it = v[u].begin(); it != v[u].end(); ++it)       if (it->v != f && !cut[it->v]) siz[u] += dfs1(it->v, u);     return siz[u];   }   inline int find(int u, int f, const int& tot) {     for (vector<ed>::iterator it = v[u].begin(); it != v[u].end(); ++it)       if (it->v != f && !cut[it->v] && 2 * siz[it->v] >= tot)         return find(it->v, u, tot);     return u;   }   inline int dfs3(int u, int f) {     int mx = 0;     for (vector<ed>::iterator it = v[u].begin(); it != v[u].end(); ++it)       if (it->v != f && !cut[it->v]) mx = max(mx, dfs3(it->v, u));     return mx + 1;   }   inline bool bfs(data st, int mxsiz) {     q.clr();     clear(q1);     clear(q2);     int j = min(R, mxsiz);     for (; j >= L; j--) q.ins(j);     for (q1.push(st); !q1.empty();) {       data nw = q1.front();       q2.push(nw);       q1.pop();       if (nw.dep > R) continue;       int dl = max(L - nw.dep, 0);       int dr = min(R - nw.dep, mxsiz);       for (; j >= dl; j--) q.ins(j);       q.del(dr);       if (q.emp()) {         int p = q.qmx();         if (nw.dis + w[p] >= 0) {           ans1 = nu[p];           ans2 = nw.u;           return true;         }       }       for (vector<ed>::iterator it = v[nw.u].begin(); it != v[nw.u].end(); ++it)         if (it->v != nw.f && !cut[it->v])           q1.push((data){it->v, nw.u, nw.dis + it->val, nw.dep + 1});     }     for (; !q2.empty(); q2.pop()) {       data a = q2.front();       if (w[a.dep] < a.dis) w[a.dep] = a.dis, nu[a.dep] = a.u;     }     return false;   }   inline bool solve(int u) {     ++tim;     int g;     if (ng[tim] == -1) {       dfs1(u, 0);       g = find(u, 0, siz[u]);       cut[g] = true;       ng[tim] = g;       nsiz[tim] = siz[u];       if (siz[u] == 1) return false;       for (int i = 1; i <= siz[u]; i++) w[i] = -0x3f3f3f3f, nu[i] = 0;       for (vector<ed>::iterator it = v[g].begin(); it != v[g].end(); ++it)         if (!cut[it->v]) it->siz = dfs3(it->v, g);       sort(v[g].begin(), v[g].end());       w[0] = 0;       nu[0] = g;     } else {       g = ng[tim];       cut[g] = true;       if (nsiz[tim] == 1) return false;       for (int i = 1; i <= nsiz[tim]; i++) w[i] = -0x3f3f3f3f, nu[i] = 0;       w[0] = 0;       nu[0] = g;     }     for (vector<ed>::iterator it = v[g].begin(); it != v[g].end(); ++it)       if (!cut[it->v])         if (bfs((data){it->v, g, it->val, 1}, it->siz)) return true;     for (vector<ed>::iterator it = v[g].begin(); it != v[g].end(); ++it)       if (!cut[it->v])         if (solve(it->v)) return true;     return false;   }   inline bool jud(int mid) {     tim = 0;     for (int i = 1; i <= n; i++)       for (vector<ed>::iterator it = v[i].begin(); it != v[i].end(); ++it)         it->val = (it->ori >= mid) ? 1 : -1;     for (int i = 1; i <= n; i++) cut[i] = false;     return solve(1);   }   int main() {     scanf( %d%d%d , &n, &L, &R);     int l = 0;     int r = 0;     for (int i = 1; i <= n; i++) ng[i] = -1;     for (int i = 1, u, V, va; i < n; i++) {       scanf( %d%d%d , &u, &V, &va);       r = max(r, va);       v[u].push_back((ed){V, 0, 0, va});       v[V].push_back((ed){u, 0, 0, va});     }     while (l != r) {       int mid = (l + r + 1) / 2;       if (jud(mid))         l = mid;       else         r = mid - 1;     }     jud(l);     printf( %d %d , ans1, ans2);     return 0;   }   