#include <bits/stdc++.h>
using namespace std;
int N,K;
vector<pair<long long int,int>> v;
long long int X,Y;
long long int lst[250100];
const long long int inf = 1e18 / 2 * 2;
vector<int> wacter;
long long int plop[250100];
struct node{
long long int s, m, e;
int num;
node *l,*r;
set<int> v;
node(long long int S, long long int E){
s = S;
e = E;
m = (s + e + inf)/2 - inf/2;
num = 0;
l = NULL;
r = NULL;
}
void update(long long int i, int k, int p){
if(s == e){
num += k;
if(p != -1){
if(k == 1) v.insert(p);
else v.erase(p);
}
return;
}
num += k;
if(i <= m){
if(l == NULL) l = new node(s,m);
l -> update(i,k,p);
}
else{
if(r == NULL) r = new node(m + 1 , e);
r -> update(i,k,p);
}
}
int query(long long int S, long long int E){
if(S <= s && e <= E){
return num;
}
int V = 0;
if(S <= m){
if(l == NULL) V += 0;
else V += l -> query(S,E);
}
if(m < E){
if(r == NULL) V += 0;
else V += r -> query(S,E);
}
return V;
}
void banana(long long int S, long long int E){
if(S <= s && e <= E && s != e){
if(l != NULL && l -> num > 0) l -> banana(S,E);
if(r != NULL && r -> num > 0) r -> banana(S,E);
return;
}
if(s == e){
for(int i : v){
wacter.push_back(i);
}
return;
}
int V = 0;
if(l == NULL) return;
if(S <= m){
l -> banana(S,E);
}
if(m < E){
r -> banana(S,E);
}
}
}*root;
int main(){
scanf(" %d",&N);
scanf(" %d",&K);
for(int i = 0; i < N; i++){
scanf(" %lld",&X);
scanf(" %lld",&Y);
v.push_back({X - Y,i});
lst[i] = X + Y;
plop[i] = X - Y;
}
v.push_back({1e16,-1});
sort(v.begin(),v.end());
long long int s = 0;
long long int e = 5e9;
root = new node(-2.1e9,2.1e9);
while(s != e){
long long int m = (s + e)/2;
int num = 0;
int it1 = 0;
int it2 = 0;
for(int i = 0; i < N; i++){
while(v[it1].first + m < v[i].first){
root -> update(lst[v[it1].second],-1,-1);
it1++;
}
while(v[i].first + m >= v[it2].first){
root -> update(lst[v[it2].second],1,-1);
it2++;
}
num += root -> query(max((long long int)-2.1e9,lst[v[i].second] - m), min(lst[v[i].second] + m,(long long int)2.1e9) ) - 1;
}
while(it1 != it2){
root -> update(lst[v[it1].second],-1,-1);
it1++;
}
if(num / 2 >= K){
e = m;
}
else{
s = m + 1;
}
}
//printf("%d",s);
map<long long int,int> mep;
int it1 = 0;
int it2 = 0;
for(int i = 0; i < N; i++){
while(v[i].first + s > v[it2].first){
root -> update(lst[v[it2].second],1,v[it2].second);
it2++;
}
while(v[it1].first + s <= v[i].first){
root -> update(lst[v[it1].second],-1,v[it1].second);
it1++;
}
root -> banana(lst[v[i].second] - s + 1, lst[v[i].second] + s - 1);
for(int j : wacter){
mep[max(abs(lst[j] - lst[v[i].second]) , abs(plop[j] - plop[v[i].second]) ) ]++;
}
wacter.clear();
}
vector<long long int> print;
mep.erase(0);
for(pair<long long int, int> ii : mep){
pair<long long int, int> temp = ii;
for(; K > 0 && temp.second > 0; K--, temp.second -= 2){
print.push_back(temp.first);
}
}
while(K > 0){
print.push_back(s);
K--;
}
for(long long int i : print){
printf("%lld\n",i);
}
}
/*
4 5
1000000000 1000000000
-1000000000 -1000000000
1000000000 -1000000000
-1000000000 1000000000
*/
Compilation message
road_construction.cpp: In member function 'void node::banana(long long int, long long int)':
road_construction.cpp:83:13: warning: unused variable 'V' [-Wunused-variable]
83 | int V = 0;
| ^
road_construction.cpp: In function 'int main()':
road_construction.cpp:99:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
99 | scanf(" %d",&N);
| ~~~~~^~~~~~~~~~
road_construction.cpp:100:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
100 | scanf(" %d",&K);
| ~~~~~^~~~~~~~~~
road_construction.cpp:103:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
103 | scanf(" %lld",&X);
| ~~~~~^~~~~~~~~~~~
road_construction.cpp:104:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
104 | scanf(" %lld",&Y);
| ~~~~~^~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
30 ms |
9616 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
10056 ms |
844248 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
10099 ms |
413876 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
10099 ms |
413876 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
30 ms |
9616 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
30 ms |
9616 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |