#include<set>
#include<cstdio>
using namespace std;
struct Point
{
int x;
int y;
Point(int x,int y):x(x),y(y) {}
bool operator<(const Point& rhs) const
{
return x<rhs.x || (x==rhs.x && y<rhs.y);
}
};
int main()
{
int T;
scanf("%d",&T);
for(int kase=1; kase<=T; kase++)
{
if(kase>1) printf("\n");
printf("Case #%d:\n",kase);
multiset<Point> S;
multiset<Point>::iterator it;
//multiset里面定义了排序x优先从小到大
int n;
scanf("%d",&n);
while(n--)
{
int x,y;
scanf("%d%d",&x,&y);
Point p(x,y);//
//lower_bound算法总体上是才用了二分查找的方法,
//但是由于是查找序列中的第
//一个出现的值大于等于val的位置
//upper_bound返回的是最后一个大于等于val的位置,
//也是有一个新元素val进来时的插入位置
it=S.lower_bound(p);// 迭代器
if( it==S.begin() || (--it)->y>p.y )//判断p是否有优势
{
//如果是第一个元素或者是有优势;
S.insert(p);//插入之后;
it=S.upper_bound(p);
//删除p后面的失去优势的所有点
while( it!=S.end() && it->y>=p.y ) S.erase(it++);
}
printf("%d\n",S.size());
}
}
return 0;
}