func_code_string: #include <bits/stdc++.h>   using namespace std;   inline void Fail() {     printf( 0 );     exit(0);   }   const int maxn = 100005;   int n, l, r, mn, id, ans, from, to, cnt, clen, mxdep, mid;   vector<pair<int, int> > edge[maxn];   pair<int, pair<int, int> > cur[maxn];   vector<int> beauty;   int sz[maxn], u[maxn], v[maxn], c[maxn], cen[maxn][25], total[maxn][25];   bool centroid[maxn], debug;   class segtree {    public:     pair<int, int> tree[maxn * 4];     int sz;     void _init(int tot) {       for (sz = 1; sz < tot; sz <<= 1)         ;       for (int(i) = 0; (i) < sz << 1; i++) tree[i] = make_pair(-1e9, -1);     }     void upd(int pos, int val, int id) {       pos += sz - 1;       tree[pos] = max(tree[pos], make_pair(val, id));       while (pos) {         pos >>= 1;         if (!pos) break;         tree[pos] = max(tree[pos << 1], tree[pos << 1 | 1]);       }     }     void clr(int pos) {       pos += sz - 1;       tree[pos] = make_pair(-1e9, -1);       while (pos) {         pos >>= 1;         if (!pos) break;         tree[pos] = max(tree[pos << 1], tree[pos << 1 | 1]);       }     }     pair<int, int> qry(int l, int r) {       if (r < 1) return make_pair(-1e9, -1);       l = max(l, 1);       r = min(r, sz);       l += sz - 1;       r += sz - 1;       pair<int, int> res = make_pair(-1e9, -1);       for (; l <= r; l >>= 1, r >>= 1) {         if (l & 1) res = max(res, tree[l++]);         if ((r - 1) & 1) res = max(res, tree[r--]);       }       return res;     }   } T;   void get_sz(int x, int p) {     sz[x] = 1;     for (int(i) = 0; (i) < edge[x].size(); i++) {       pair<int, int> y = edge[x][i];       if (centroid[y.first] || y.first == p) continue;       get_sz(y.first, x);       sz[x] += sz[y.first];     }   }   void get_centroid(int x, int p, int tot) {     int mx = tot - sz[x];     for (int(i) = 0; (i) < edge[x].size(); i++) {       pair<int, int> y = edge[x][i];       if (centroid[y.first] || y.first == p) continue;       get_centroid(y.first, x, tot);       mx = max(mx, sz[y.first]);     }     if (mx < mn) {       mn = mx;       id = x;     }   }   void get_dis(int x, int p, int dep, int dis, int s) {     mxdep = max(mxdep, dep);     cur[clen++] = make_pair(dep, make_pair(dis, x));     pair<int, int> mx = T.qry(l - dep + 1, r - dep + 1);     if (dis + mx.first > ans) {       ans = dis + mx.first;       from = x;       to = mx.second;     }     for (int(i) = 0; (i) < edge[x].size(); i++) {       pair<int, int> y = edge[x][i];       if (centroid[y.first] || y.first == p) continue;       get_dis(y.first, x, dep + 1, dis + (y.second >= mid ? 1 : -1), s);     }   }   void solve(int t, int dep) {     int s = cen[t][dep];     if (s < 0) {       mn = 1e9;       get_sz(t, -1);       get_centroid(t, -1, sz[t]);       s = id;       cen[t][dep] = s;       total[t][dep] = sz[t];     }     centroid[s] = true;     T._init(total[t][dep] + 1);     T.upd(1, 0, s);     for (int(i) = 0; (i) < edge[s].size(); i++) {       if (centroid[edge[s][i].first]) continue;       clen = 0;       get_dis(edge[s][i].first, s, 1, edge[s][i].second >= mid ? 1 : -1, s);       for (int(j) = 0; (j) < clen; j++) {         T.upd(cur[j].first + 1, cur[j].second.first, cur[j].second.second);       }     }     for (int(i) = 0; (i) < edge[s].size(); i++)       if (!centroid[edge[s][i].first]) solve(edge[s][i].first, dep + 1);     centroid[s] = false;   }   void add_edge(int x, int y, int z) {     edge[x].push_back(make_pair(y, z));     edge[y].push_back(make_pair(x, z));   }   bool check() {     ans = -1e9;     solve(0, 0);     return ans >= 0;   }   int main() {     memset(cen, -1, sizeof(cen));     scanf( %d%d%d , &n, &l, &r);     for (int(i) = 0; (i) < n - 1; i++) {       scanf( %d%d%d , &u[i], &v[i], &c[i]);       u[i]--, v[i]--;       add_edge(u[i], v[i], c[i]);       beauty.push_back(c[i]);     }     sort(beauty.begin(), beauty.end());     beauty.resize(unique(beauty.begin(), beauty.end()) - beauty.begin());     int L = 0, R = beauty.size();     while (R - L > 1) {       int Mid = (L + R) >> 1;       mid = beauty[Mid];       if (check())         L = Mid;       else         R = Mid;     }     debug = true;     mid = beauty[L];     check();     printf( %d %d , from + 1, to + 1);     return 0;   }   