#include #include #include using namespace std; const int maxn=20001,maxm=maxn*100; inline int Max(int a,int b){return a>b?a:b;} int a[maxm],b[maxm]; int f[maxn][20],ff[maxn]; int ne[maxm]; int tree[maxm]; int lowbit(int t) { return t&-t; } int ask(int k) { int res=0; while (k) { res=Max(res,tree[k]); k-=lowbit(k); } return res; } void change(int k,int d,int n) { while (k<=n) { tree[k]=Max(tree[k],d); k+=lowbit(k); } } int n,m; char buf[2048576],*o; int getint() { while (!isdigit(*o)) o++; int f = 0; while (isdigit(*o)) f=f*10+*o-'0',o++; return f; } void iin() { int i,j,k,col,pos; scanf("%d%d\n",&n,&m); for (i=0;i<=n*m*2+10;i++) { ne[i]=i+1; a[i]=0; } for (i=0;i=0;j--) { k=f[a[i]][j]; int t=ask(k-1)+1; maxres=Max(maxres,t); change(k,t,n*m); } printf("%d\n",maxres); } int main() { int cass,cas=0; for (scanf("%d\n",&cass);cass--;) { iin(); cas++; printf("Case #%d: ",cas); dp(); } return 0; }