#include using namespace std; long long MX, N, dis, rv[100009], stk[100009], H[100009], h[100009], aib[100009]; long long K, knt; vector < pair < long long, long long > > v[100009]; vector < long long > fii[100009]; pair < long long, long long > nor[100009]; void dfs (long long nod, long long tata) { for (vector < pair < long long, long long > > :: iterator it = v[nod].begin (); it != v[nod].end (); it ++) if (it->first != tata) H[it->first] = H[nod] + it->second, dfs (it->first, nod), fii[nod].push_back (it->first); } void Update (long long pos, long long val) { while (pos <= dis) aib[pos] += val, pos += pos - (pos & (pos - 1)); } long long Query (long long pos) { long long sum = 0; while (pos) sum += aib[pos], pos &= pos - 1; return sum; } void solve (long long nod) { long long p = 1, u = dis, mij, ras = dis + 1, lim = H[nod] - MX; while (p <= u) { mij = (p + u) >> 1; if (rv[mij] >= lim) ras = mij, u = mij - 1; else p = mij + 1; } knt += Query (dis - ras + 1); Update (dis - h[nod] + 1, +1); for (vector < long long > :: iterator it = fii[nod].begin (); it != fii[nod].end (); it ++) solve (*it); Update (dis - h[nod] + 1, -1); } long long Knt (long long val) { MX = val, knt = 0; solve (1); for (int i=1; i<=dis; i++) aib[i] = 0; return knt; } int main() { //freopen ("input", "r", stdin); //freopen ("output", "w", stdout); scanf ("%lld %lld", &N, &K); for (int i=1; i> 1; // printf ("%d -> %lld\n", mij, Knt (mij)); if (Knt (mij) >= K) ras = mij, u = mij - 1; else p = mij + 1; } printf ("%lld\n", ras); return 0; }