#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct node{
double x,y;
}a[1010];
int cmp(node x,node y)
{
if(x.x==y.x)return x.y<y.y;
else return x.x<y.x;
}
int main()
{
int n,sum,i,count=1;
double t1,t2,d,temp,t;
bool tag;
while(cin>>n>>d)
{
if(n==0&&d==0.0) break;
tag=false;
if(d<0) tag=true;
for(i=0;i<n;i++)
{
cin>>t1>>t2;
t=sqrt(d*d-t2*t2);
a[i].x=t1*1.0-t;
a[i].y=t1*1.0+t;
if(t2>d||t2<0)
tag=true;
}
if(tag)
{
cout<<"Case "<<count<<": -1"<<endl;
count++;
continue;
}
sort(a,a+n,cmp);
temp=a[0].y;
sum=1;
for(i=1;i<n;i++)
{
if(a[i].x>temp)
{
sum++;
temp=a[i].y;
}
else if(a[i].y<temp)
temp=a[i].y;
}
cout<<"Case "<<count<<": "<<sum<<endl;
count++;
}
return 0;
}
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct node{
double l;
double r;
}interval[1001];
int comp(node p1,node p2)
{
return p1.r>p2.r?1:-1;
}
int main()
{
int n;
double r;
int cnt=0;
double x,y;
bool covered[1001];
while(cin>>n&&cin>>r&&!(n==0&&r==0)){
cnt++;
bool ok=false;
if(r<=0)
ok=true;
for(int i=0;i<n;i++){
cin>>x>>y;
if(r<y){
ok=true;
}
else{
double temp=sqrt((r*r-y*y));
interval[i].l=x-temp;
interval[i].r=x+temp;
}
}
if(ok)
cout<<"Case "<<cnt<<": -1"<<endl;
else{
memset(covered,false,sizeof(covered));
sort(interval,interval+n-1,comp);
int sum=0;
for(int j=0;j<n;j++){
if(!covered[j]){
sum++;covered[j]=true;
for(int i=j+1;i<n;i++){
if(interval[i].l<=interval[j].r)
covered[i]=true;
}
}
}
cout<<"Case "<<cnt<<": "<<sum<<endl;
}
}
return 0;
}