#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 1e5 + 5;
// Nhận xét: Với khoảng cách d càng lớn thì vị trí của d trong dãy sau khi sort càng lớn
// => Tìm kiếm nhị phân khoảng cách d đầu tiên có vị trí >= k
// Vị trí của d = (Số cặp (i, j) sao cho dist(i, j) <= d), với dist(i, j) là khoảng cách giữa 2 ngôi nhà i, j
// Nhận xét: dist(i, j) = max(|x(i) - x(j)|, |y(i) - y(j)|) hay còn gọi là khoảng cách Chebyshev
// dist(i, j) <= d <=> max(|x(i) - x(j)|, |y(i) - y(j)|) <= d
// <=> |x(i) - x(j)| <= d và |y(i) - y(j)| <= d
// Do đó để đơn giản hơn cho việc tính toán vị trí của d thì ta sẽ sort lại toạ độ của các ngôi nhà theo x
// Khi xét đến ngôi nhà thứ i, ta sẽ đếm xem có bao nhiêu ngôi nhà j > i sao cho dist(i, j) <= d
// Vì các ngôi nhà đã được sort lại theo x nên lúc này |x(i) - x(j)| = x(j) - x(i)
// Để x(j) - x(i) <= d thì x(j) <= x(i) + d
// Nên với mỗi i, cần tìm j xa nhất thoả mãn x(j) <= x(i) + d, tạm gọi là rj
// Lúc này cần đếm xem có bao nhiêu chỉ số j thuộc [i + 1, rj] sao cho |y(i) - y(j)| <= d
// <=> y(j) thuộc đoạn [y(i) - d, y(i) + d]
// => Có thể áp dụng kĩ thuật 2 con trỏ và duy trì thêm 1 CTDL như BIT trong quá trình 2 con trỏ
struct Point {
int x, y;
bool operator<(const Point& other) const {
return x < other.x;
}
};
struct fenwick {
int n;
vector<int> ft;
fenwick(int n): n(n) {
ft.resize(n, 0);
}
void update(int pos, int val) {
for (; pos < n; pos = pos | (pos + 1)) ft[pos] += val;
}
int get(int pos) {
int ans = 0;
for (; pos >= 0; pos = (pos & (pos + 1)) - 1) ans += ft[pos];
return ans;
}
};
int n; ll k;
Point a[N];
vector<int> vals; // Danh sách những giá trị cần nén
// Giá trị nén của x
int getVal(int x) {
return lower_bound(vals.begin(), vals.end(), x) - vals.begin();
}
bool check(ll d) {
fenwick BIT(vals.size());
ll pos = 0;
for (int i = 1, j = 0; i <= n; i++) {
// j xa nhất thoả mãn a[j].x <= a[i].x + d
while (j + 1 <= n && a[j + 1].x <= a[i].x + d) {
j++;
int u = getVal(a[j].y);
BIT.update(u, 1);
}
// Đếm số lượng j thoả mãn a[j].y thuộc đoạn [a[i].y - d, a[i].y + d]
int l = lower_bound(vals.begin(), vals.end(), a[i].y - d) - vals.begin() - 1; // Giá trị nén của phần tử lớn nhất < a[i].y - d
int r = upper_bound(vals.begin(), vals.end(), a[i].y + d) - vals.begin() - 1; // Giá trị nén của phần tử lớn nhất <= a[i].y + d
pos += BIT.get(r) - BIT.get(l);
pos -= 1; // Trừ trường hợp j = i
int u = getVal(a[i].y);
BIT.update(u, -1);
}
return (pos >= k);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i].x >> a[i].y;
vals.push_back(a[i].y);
}
sort(a + 1, a + n + 1);
sort(vals.begin(), vals.end());
vals.resize(unique(vals.begin(), vals.end()) - vals.begin());
ll l = 0, r = 2e9, ans = -1;
while (l <= r) {
ll mid = (l + r) >> 1;
if (check(mid)) {
ans = mid;
r = mid - 1;
}
else {
l = mid + 1;
}
}
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAxZTUgKyA1OyAKCi8vIE5o4bqtbiB4w6l0OiBW4bubaSBraG/huqNuZyBjw6FjaCBkIGPDoG5nIGzhu5tuIHRow6wgduG7iyB0csOtIGPhu6dhIGQgdHJvbmcgZMOjeSBzYXUga2hpIHNvcnQgY8OgbmcgbOG7m24KLy8gPT4gVMOsbSBraeG6v20gbmjhu4sgcGjDom4ga2hv4bqjbmcgY8OhY2ggZCDEkeG6p3UgdGnDqm4gY8OzIHbhu4sgdHLDrSA+PSBrIAovLyBW4buLIHRyw60gY+G7p2EgZCA9IChT4buRIGPhurdwIChpLCBqKSBzYW8gY2hvIGRpc3QoaSwgaikgPD0gZCksIHbhu5tpIGRpc3QoaSwgaikgbMOgIGtob+G6o25nIGPDoWNoIGdp4buvYSAyIG5nw7RpIG5ow6AgaSwgagovLyBOaOG6rW4geMOpdDogZGlzdChpLCBqKSA9IG1heCh8eChpKSAtIHgoail8LCB8eShpKSAtIHkoail8KSBoYXkgY8OybiBn4buNaSBsw6Aga2hv4bqjbmcgY8OhY2ggQ2hlYnlzaGV2Ci8vIGRpc3QoaSwgaikgPD0gZCA8PT4gbWF4KHx4KGkpIC0geChqKXwsIHx5KGkpIC0geShqKXwpIDw9IGQgCi8vICAgICAgICAgICAgICAgICA8PT4gfHgoaSkgLSB4KGopfCA8PSBkIHbDoCB8eShpKSAtIHkoail8IDw9IGQKLy8gRG8gxJHDsyDEkeG7gyDEkcahbiBnaeG6o24gaMahbiBjaG8gdmnhu4djIHTDrW5oIHRvw6FuIHbhu4sgdHLDrSBj4bunYSBkIHRow6wgdGEgc+G6vSBzb3J0IGzhuqFpIHRv4bqhIMSR4buZIGPhu6dhIGPDoWMgbmfDtGkgbmjDoCB0aGVvIHgKLy8gS2hpIHjDqXQgxJHhur9uIG5nw7RpIG5ow6AgdGjhu6kgaSwgdGEgc+G6vSDEkeG6v20geGVtIGPDsyBiYW8gbmhpw6p1IG5nw7RpIG5ow6AgaiA+IGkgc2FvIGNobyBkaXN0KGksIGopIDw9IGQKLy8gVsOsIGPDoWMgbmfDtGkgbmjDoCDEkcOjIMSRxrDhu6NjIHNvcnQgbOG6oWkgdGhlbyB4IG7Dqm4gbMO6YyBuw6B5IHx4KGkpIC0geChqKXwgPSB4KGopIC0geChpKQovLyDEkOG7gyB4KGopIC0geChpKSA8PSBkIHRow6wgeChqKSA8PSB4KGkpICsgZAovLyBOw6puIHbhu5tpIG3hu5dpIGksIGPhuqduIHTDrG0gaiB4YSBuaOG6pXQgdGhv4bqjIG3Do24geChqKSA8PSB4KGkpICsgZCwgdOG6oW0gZ+G7jWkgbMOgIHJqCi8vIEzDumMgbsOgeSBj4bqnbiDEkeG6v20geGVtIGPDsyBiYW8gbmhpw6p1IGNo4buJIHPhu5EgaiB0aHXhu5ljIFtpICsgMSwgcmpdIHNhbyBjaG8gfHkoaSkgLSB5KGopfCA8PSBkCi8vIAkJCQkJCQkJCQkJCQkJCQkgICA8PT4geShqKSB0aHXhu5ljIMSRb+G6oW4gW3koaSkgLSBkLCB5KGkpICsgZF0KLy8gPT4gQ8OzIHRo4buDIMOhcCBk4bulbmcga8SpIHRodeG6rXQgMiBjb24gdHLhu48gdsOgIGR1eSB0csOsIHRow6ptIDEgQ1RETCBuaMawIEJJVCB0cm9uZyBxdcOhIHRyw6xuaCAyIGNvbiB0cuG7jyAKc3RydWN0IFBvaW50IHsKCWludCB4LCB5OyAgCglib29sIG9wZXJhdG9yPChjb25zdCBQb2ludCYgb3RoZXIpIGNvbnN0IHsKCQlyZXR1cm4geCA8IG90aGVyLng7IAoJfQp9OyAKCnN0cnVjdCBmZW53aWNrIHsKCWludCBuOyAKCXZlY3RvcjxpbnQ+IGZ0OyAgCgoJZmVud2ljayhpbnQgbik6IG4obikgewoJCWZ0LnJlc2l6ZShuLCAwKTsgIAoJfQoKCXZvaWQgdXBkYXRlKGludCBwb3MsIGludCB2YWwpIHsKCQlmb3IgKDsgcG9zIDwgbjsgcG9zID0gcG9zIHwgKHBvcyArIDEpKSBmdFtwb3NdICs9IHZhbDsgCgl9CgoJaW50IGdldChpbnQgcG9zKSB7CgkJaW50IGFucyA9IDA7ICAgCgkJZm9yICg7IHBvcyA+PSAwOyBwb3MgPSAocG9zICYgKHBvcyArIDEpKSAtIDEpIGFucyArPSBmdFtwb3NdOyAKCQlyZXR1cm4gYW5zOyAgCgl9Cn07CgppbnQgbjsgbGwgazsgIApQb2ludCBhW05dOyAgCgp2ZWN0b3I8aW50PiB2YWxzOyAvLyBEYW5oIHPDoWNoIG5o4buvbmcgZ2nDoSB0cuG7iyBj4bqnbiBuw6luCgovLyBHacOhIHRy4buLIG7DqW4gY+G7p2EgeAppbnQgZ2V0VmFsKGludCB4KSB7IAoJcmV0dXJuIGxvd2VyX2JvdW5kKHZhbHMuYmVnaW4oKSwgdmFscy5lbmQoKSwgeCkgLSB2YWxzLmJlZ2luKCk7ICAKfQoKYm9vbCBjaGVjayhsbCBkKSB7CglmZW53aWNrIEJJVCh2YWxzLnNpemUoKSk7ICAKCWxsIHBvcyA9IDA7ICAgCglmb3IgKGludCBpID0gMSwgaiA9IDA7IGkgPD0gbjsgaSsrKSB7CgkJLy8gaiB4YSBuaOG6pXQgdGhv4bqjIG3Do24gYVtqXS54IDw9IGFbaV0ueCArIGQKCQl3aGlsZSAoaiArIDEgPD0gbiAmJiBhW2ogKyAxXS54IDw9IGFbaV0ueCArIGQpIHsKCQkJaisrOyAKCQkJaW50IHUgPSBnZXRWYWwoYVtqXS55KTsgCgkJCUJJVC51cGRhdGUodSwgMSk7IAoJCX0KCQkKCQkvLyDEkOG6v20gc+G7kSBsxrDhu6NuZyBqIHRob+G6oyBtw6NuIGFbal0ueSB0aHXhu5ljIMSRb+G6oW4gW2FbaV0ueSAtIGQsIGFbaV0ueSArIGRdCgkJaW50IGwgPSBsb3dlcl9ib3VuZCh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCksIGFbaV0ueSAtIGQpIC0gdmFscy5iZWdpbigpIC0gMTsgLy8gR2nDoSB0cuG7iyBuw6luIGPhu6dhIHBo4bqnbiB04butIGzhu5tuIG5o4bqldCA8IGFbaV0ueSAtIGQKCQlpbnQgciA9IHVwcGVyX2JvdW5kKHZhbHMuYmVnaW4oKSwgdmFscy5lbmQoKSwgYVtpXS55ICsgZCkgLSB2YWxzLmJlZ2luKCkgLSAxOyAvLyBHacOhIHRy4buLIG7DqW4gY+G7p2EgcGjhuqduIHThu60gbOG7m24gbmjhuqV0IDw9IGFbaV0ueSArIGQKCQlwb3MgKz0gQklULmdldChyKSAtIEJJVC5nZXQobCk7IAoJCXBvcyAtPSAxOyAvLyBUcuG7qyB0csaw4budbmcgaOG7o3AgaiA9IGkgIAoKCQlpbnQgdSA9IGdldFZhbChhW2ldLnkpOyAKCQlCSVQudXBkYXRlKHUsIC0xKTsgCgl9CglyZXR1cm4gKHBvcyA+PSBrKTsgIAp9CgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgCgljaW4udGllKG51bGxwdHIpOyAJCgljaW4gPj4gbiA+PiBrOyAKCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKCQljaW4gPj4gYVtpXS54ID4+IGFbaV0ueTsgIAoJCXZhbHMucHVzaF9iYWNrKGFbaV0ueSk7ICAKCX0KCglzb3J0KGEgKyAxLCBhICsgbiArIDEpOyAgIAoJCglzb3J0KHZhbHMuYmVnaW4oKSwgdmFscy5lbmQoKSk7ICAKCXZhbHMucmVzaXplKHVuaXF1ZSh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCkpIC0gdmFscy5iZWdpbigpKTsgIAoKCWxsIGwgPSAwLCByID0gMmU5LCBhbnMgPSAtMTsgIAoJd2hpbGUgKGwgPD0gcikgewoJCWxsIG1pZCA9IChsICsgcikgPj4gMTsgCgoJCWlmIChjaGVjayhtaWQpKSB7CgkJCWFucyA9IG1pZDsgCgkJCXIgPSBtaWQgLSAxOyAKCQl9CgkJZWxzZSB7CgkJCWwgPSBtaWQgKyAxOyAKCQl9Cgl9CgoJY291dCA8PCBhbnMgPDwgJ1xuJzsgCn0=