#include #include #include #define endl '\n' #define fi first #define se second using namespace std; using namespace __gnu_pbds; typedef tree,rb_tree_tag,tree_order_statistics_node_update> ordered_set; const int MAXN=1e5+5; int n,r; long long R; pair p[MAXN]; vector adj[MAXN]; bool g[5005][5005]; int cnt[MAXN]; pair pt[MAXN]; int id[MAXN]; set poss; ordered_set clq; bool used[MAXN]; int bestSz=0; vector bestClq; long long dist(pair a,pair b) { long long dx=a.fi-b.fi; long long dy=a.se-b.se; return dx*dx+dy*dy; } bool intersect(int ind1,int ind2) { if(dist(p[ind1], p[ind2])0) poss.erase(u); } } void removeVert(int ind) { auto it=clq.find_by_order(ind); int v=(*it); used[v]=0; clq.erase(it); poss.insert(v); for(auto u: adj[v]) { bool fl=0; for(auto x: clq) { if(g[u][x]) { fl=1; break; } } if(!fl) poss.insert(u); } } struct Point { int x,y; int num; }; Point p1[MAXN]; deque q; vector cur; vector ans; long long dist1(Point a,Point b) { long long dx=a.x-b.x; long long dy=a.y-b.y; return dx*dx+dy*dy; } bool intersect1(int ind1,int ind2) { if(dist1(p1[ind1], p1[ind2])b.y; return a.x>b.x; }); } int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); freopen("mars.in","r",stdin); freopen("mars.out","w",stdout); cin>>n>>r; for(int i=1;i<=n;i++) { cin>>p[i].fi>>p[i].se; p1[i].x=p[i].fi; p1[i].y=p[i].se; p1[i].num=i; } R=2*r; if(n<=5000) { for(int i=1;iind2) swap(ind1,ind2); removeVert(ind1); removeVert(ind2-1); while(!poss.empty()) { addVert((*poss.begin())); } if(clq.size()>bestSz) updBest(); } clearClq(); for(auto x: bestClq) addVert(x); while(true) { bool fl=0; for(int i=0;ibestSz) { bestSz=clq.size(); fl=1; break; } } if(!fl) break; } updBest(); } for(int dr=0;dr<2;dr++) { if(dr==0) sort1(); else sort2(); int ITER; if(n<=5000) ITER=n; else ITER=200; for(int ii=1;ii<=ITER;ii++) { cur.clear(); while(!q.empty()) q.pop_front(); add(ii); for(int i=ii+1;i<=n;i++) { if(!dr) while(!q.empty() && p1[q.front()].x<=p1[i].x-R) q.pop_front(); else while(!q.empty() && p1[q.front()].x>=p1[i].x+R) q.pop_front(); bool fl=1; for(int j=0;jans.size()) ans=cur; } } if(ans.size()>bestSz) { cout<