#include using namespace std; const int nmax=1e5+42; int n,r; struct point { int x,y,id; }; point inp[nmax]; bool cmp_x(point a,point b) { if(a.x!=b.x)return a.x outp; void print() { printf("%i\n",outp.size()); for(auto w:outp)printf("%i ",w); printf("\n"); exit(0); } bool adj(int i,int w) { return 1LL*(inp[i].x-inp[w].x)*(inp[i].x-inp[w].x)+1LL*(inp[i].y-inp[w].y)*(inp[i].y-inp[w].y)<2LL*r*2LL*r; } void eval_random() { if(1.0*(clock()-T)/CLOCKS_PER_SEC>4.5)print(); vector cur={}; for(int i=1;i<=n;i++) { bool ok=1; for(auto w:cur) if(adj(w,i)) { ok=0; break; } if(ok)cur.push_back(i); } if(outp.size() cur={}; for(int i=1;i<=n;i++) { int least=1; for(int j=2;j<=n;j++) if(deg[least]>deg[j])least=j; if(removed[least])break; bool ok=1; for(auto w:cur) if(1LL*(inp[least].x-inp[w].x)*(inp[least].x-inp[w].x)+1LL*(inp[least].y-inp[w].y)*(inp[least].y-inp[w].y)<2LL*r*2LL*r) { ok=0; break; } if(ok) { cur.push_back(least); removed[least]=1; deg[least]=1e9; for(int j=1;j<=n;j++) if(adj(least,j)&&removed[j]==0) { deg[j]--; removed[j]=1; deg[j]=1e9; for(int k=1;k<=n;k++) if(adj(j,k)) deg[k]--; } } } if(outp.size()4.5)print(); eval_random(); if(n<=5000)eval_deg(); } mt19937 rng(42); int main() { T=clock(); freopen("mars.in","r",stdin); freopen("mars.out","w",stdout); scanf("%i%i",&n,&r); for(int i=1;i<=n;i++) { scanf("%i%i",&inp[i].x,&inp[i].y); inp[i].id=i; } if(n<=5000) { for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if(adj(i,j)) { DEG_ORIGINAL[i]++; DEG_ORIGINAL[j]++; } } eval(); sort(inp+1,inp+n+1,cmp_x); eval(); reverse(inp+1,inp+n+1); eval(); sort(inp+1,inp+n+1,cmp_y); eval(); reverse(inp+1,inp+n+1); eval(); while(1) { shuffle(inp+1,inp+n+1,rng); eval(); } return 0; }