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