/*
*POJ 1328 看了解题报告。觉得思路很简单。就是把每个island的区间求出来。方法是也就是以该island为圆心,画半圆。和x-axis的两交点就是区间端点。
*然后。temp为第一个点的右端点。ans = 1。开始遍历。如果遇见一个点的左端点大于temp。就ans++。temp重新设为这个点的右端点。即又安了一个雷达。
*最后输出ans就好了。
*因为没有考虑d<0的情况。所以WA了几次。果然出数据的人都是不可靠的。
*还有就是 输入循环里的break 和 外层循环里的 continue ...各种debug...
*/
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
#define tot 1000+10
struct Interval // 保存每个点的可设雷达区间。
{
double left, right;
} interval[tot];
struct Point
{
int x, y;
} point[tot];
int n, d, ans;
int i, j, k;
int cnt = 0;
double cmp(Interval a, Interval b) //对区间排序
{
if (a.right != b.right)
return a.right < b.right;
else return a.left < b.left;
}
int main()
{
ans = 0;
bool flag = true;
while(cin >> n >> d)
{
flag = true;
ans = 0;
if (n == 0 && d == 0)
break;
if (d < 0) flag = false; // 数据并没有说 d>=0 ...没有结果输出-1的情况。
cout << "Case " << ++cnt << ": ";
for (i=0; i<n; ++i)
{
cin >> point[i].x >> point[i].y;
double ans = d*d - point[i].y*point[i].y; //计算每个小岛的区间范围。
if (ans < 0)
{
flag = false;
// break; // break会使输入中断。
}
else if (flag)
{
ans = sqrt(ans);
interval[i].left = point[i].x - ans;
interval[i].right = point[i].x + ans;
}
}
if (!flag)
{
cout << -1 << endl;
continue; // 不是break.
}
sort(interval, interval+n, cmp);
double temp = interval[0].right;
ans += 1;
for (int i=1; i<n; ++i)
{
if (interval[i].left > temp) // 新安上一个雷达。
{
ans += 1;
temp = interval[i].right;
}
}
cout << ans << endl;
}
return 0;
}