//dp+二分
//最长上升序列
#include<iostream>
#define Max 500005
using namespace std;
int a[Max], dp[Max];
int n;
int A()//这个模块是用来节省时间的x=A()相当于scanf("%d", x);
{
char c;
int temp = 0;
while((c=getchar()) < '0' || c > '9');
temp = c - '0';
while((c=getchar()) >= '0' && c <= '9') temp = temp * 10 + (c-'0');
return temp;
}
//a[]表示原来的序列,dp不一定是要求的序列
int lis()//最长上升序列
{
int i, low, up, mid, times=1;
dp[1] = a[1];
for( i=2; i <= n; i++ )
{
low = 1;
up = times;
while(low <= up)
{
mid = (low+up) / 2;
if(a[i] > dp[mid])
low = mid + 1;
else
up = mid - 1;
}
dp[low] = a[i];
if(low > times)
times = low;
}
return times;
}
int main()
{
int p=1, i;
while(scanf("%d", &n) != EOF )
{
for( i=0; i < n; i++ )
{
int x, y;
//scanf("%d%d", &x, &y );
x = A();
y = A();
a[x] = y;
}
int ans = lis();
if(ans==1)
printf("Case %d:\nMy king, at most 1 road can be built.\n\n", p++);
else
printf("Case %d:\nMy king, at most %d roads can be built.\n\n", p++, ans);
}
return 0;
}
//最长上升序列
#include<iostream>
#define Max 500005
using namespace std;
int a[Max], dp[Max];
int n;
int A()//这个模块是用来节省时间的x=A()相当于scanf("%d", x);
{
char c;
int temp = 0;
while((c=getchar()) < '0' || c > '9');
temp = c - '0';
while((c=getchar()) >= '0' && c <= '9') temp = temp * 10 + (c-'0');
return temp;
}
//a[]表示原来的序列,dp不一定是要求的序列
int lis()//最长上升序列
{
int i, low, up, mid, times=1;
dp[1] = a[1];
for( i=2; i <= n; i++ )
{
low = 1;
up = times;
while(low <= up)
{
mid = (low+up) / 2;
if(a[i] > dp[mid])
low = mid + 1;
else
up = mid - 1;
}
dp[low] = a[i];
if(low > times)
times = low;
}
return times;
}
int main()
{
int p=1, i;
while(scanf("%d", &n) != EOF )
{
for( i=0; i < n; i++ )
{
int x, y;
//scanf("%d%d", &x, &y );
x = A();
y = A();
a[x] = y;
}
int ans = lis();
if(ans==1)
printf("Case %d:\nMy king, at most 1 road can be built.\n\n", p++);
else
printf("Case %d:\nMy king, at most %d roads can be built.\n\n", p++, ans);
}
return 0;
}