#include #include #include #include using namespace std ; using ll = long long ; vector>> bylev ; int main(int argc, char *argv[]) { int divi = 50 ; if (argc > 1) divi = atof(argv[1]) ; int n, k ; cin >> n >> k ; vector x(n) ; bylev.resize(n+1) ; for (int i=0; i> x[i] ; x[i] *= 2 ; } x.push_back(0) ; vector > sortme ; for (int i=0; i > > sortme2 ; vector lims ; for (int sz=k; ; sz = (sz + 1 + sz / divi)) { lims.push_back(sz) ; sortme2.push_back({}) ; if (sz >= n) break ; } for (int i=0; i=0 && k q ; vector dist(32*(n+1), -1) ; q.push_back(32*n+1) ; dist[32*n+1] = 0 ; vector r(n+1, -1) ; vector w ; int hib = 1 ; while (hib < (int)lims.size()) hib *= 2 ; for (int qg=0; qg<(int)q.size(); qg++) { int at = q[qg] >> 5 ; int b = q[qg] & 31 ; if (bylev[at].size() == 0) bylev[at].resize(32) ; if (bylev[at][b].size() == 0) { ll xx = x[at] ; ll lo = xx - (1LL << b) ; ll hi = xx + (1LL << b) ; int good = lims.size()-1 ; for (ll bit=hib; bit; bit>>=1) if (good >= bit) { auto &sortme = sortme2[good-bit] ; pair lok({lo, -1}) ; pair hik({hi, n+1}) ; auto loit = lower_bound(sortme.begin(), sortme.end(), lok) ; auto hiit = lower_bound(sortme.begin(), sortme.end(), hik) ; int wcnt = hiit - loit ; if (wcnt >= k) good -= bit ; if (wcnt == k) { for (auto it=loit; itsecond) ; break ; } } if (bylev[at][b].size() == 0) { auto &sortme = sortme2[good] ; pair lok({lo, -1}) ; pair hik({hi, n+1}) ; auto loit = lower_bound(sortme.begin(), sortme.end(), lok) ; auto hiit = lower_bound(sortme.begin(), sortme.end(), hik) ; w.clear() ; while (loit < hiit) w.push_back(-loit++->second) ; nth_element(w.begin(), w.begin()+k, w.end()) ; for (int i=0; i= 0 && b2 < 32 && dist[32*at+b2] < 0) { if (db > 0 || (int)bylev[at][b].size() >= k) { dist[32*at+b2] = d + 1 ; q.push_back(32*at+b2) ; } } } } for (int i=0; i