#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <cmath> #include <algorithm> using namespace std; const int maxn=50500; const double zero=1e-8; const double inf=1e10; int n,K,m,L,tot,root,ans; int E[maxn],pre[maxn],fst[maxn]; int V[maxn],ft[maxn],pl[maxn],pr[maxn],f[maxn][110],g[maxn][110],h[maxn],q[maxn]; struct Event { double x,y,r,px; int id,v; Event(){}; Event(double _x,double _y,double _r,double _px,int i,int _v) {x=_x; y=_y; r=_r; px=_px; id=i; v=_v;}; bool operator <(const Event &rhs)const { return px+zero<rhs.px; } double gety(double x0,int v0) { if(fabs(x0-x)+zero>=r) return y; double tmp=sqrt(r*r-(x-x0)*(x-x0)); if(v0==0) return y-tmp; else return y+tmp; } }Et[2*maxn]; struct Tree { int ft,lc,rc,x,v; void clear() {ft=lc=rc=x=v=0;} }tr[4*maxn]; struct Splay { void New(int i) { tr[++tot].clear(); tr[tot].x=i; tr[tot].v=0; tr[tot].rc=tot+1; pl[Et[i].id]=tot; tr[++tot].clear(); tr[tot].x=i; tr[tot].v=1; tr[tot].ft=tot-1; pr[Et[i].id]=tot; } void rotate(int x) { int y=tr[x].ft,z=tr[y].ft; if(tr[z].lc==y) tr[z].lc=x; else tr[z].rc=x; tr[x].ft=z; tr[y].ft=x; if(tr[y].lc==x) tr[y].lc=tr[x].rc,tr[tr[x].rc].ft=y,tr[x].rc=y; else tr[y].rc=tr[x].lc,tr[tr[x].lc].ft=y,tr[x].lc=y; } void splay(int x,int p) { int fa=tr[p].ft; while(tr[x].ft!=fa) { int y=tr[x].ft,z=tr[y].ft; if(z==fa) {rotate(x); continue;} if((tr[y].lc==x)^(tr[z].lc==y)) rotate(x); else rotate(y); rotate(x); } if(p==root) root=x; } int select(int i) { int p=root,ql=p,qr=p; double x=Et[i].px,y=Et[i].y; while(p>0) { int id=tr[p].x,v=tr[p].v; double y0; if(id==0) y0=v?inf:-inf; else y0=Et[id].gety(x,v); if(y0+zero<y) ql=p,p=tr[p].rc; else qr=p,p=tr[p].lc; } splay(ql,root); splay(qr,tr[root].rc); return qr; } int getpre(int x) { splay(x,root); int p=tr[x].lc; while(tr[p].rc) p=tr[p].rc; return p; } int getnext(int x) { splay(x,root); int p=tr[x].rc; while(tr[p].lc) p=tr[p].lc; return p; } }Tr; int get() { int f=0,v=0; char ch; while(!isdigit(ch=getchar())) if(ch=='-') break; if(ch=='-') f=1; else v=ch-48; while(isdigit(ch=getchar())) v=v*10+ch-48; if(f) return -v; else return v; } void init() { m=0; int x,y,r; n=get(); K=get()+1; for(int i=1;i<=n;i++) { x=get(); y=get(); r=get(); V[i]=get(); Et[++m]=Event(x,y,r,x-r,i,1); Et[++m]=Event(x,y,r,x+r,i,0); } } void add(int a,int b) { E[++L]=b; pre[L]=fst[a]; fst[a]=L; } void build() { tot=L=0; root=1; memset(fst,0,sizeof(fst)); tr[0].clear(); Tr.New(0); sort(Et+1,Et+m+1); for(int i=1;i<=m;i++) if(Et[i].v) { Tr.New(i); int k=Tr.select(i); tr[tot-1].ft=k; tr[k].lc=tot-1; ft[Et[i].id]=(tr[k].v)?Et[tr[k].x].id:ft[Et[tr[k].x].id]; add(ft[Et[i].id],Et[i].id); }else { int a=Tr.getpre(pl[Et[i].id]),b=Tr.getnext(pr[Et[i].id]); Tr.splay(a,root); Tr.splay(b,tr[root].rc); tr[tr[b].lc].ft=0; tr[b].lc=0; } } void bfs() { int head=1,tail=2; q[head]=0; while(head<tail) { int u=q[head]; for(int k=fst[u];k;k=pre[k]) q[tail++]=E[k]; head++; } } void dp() { for(int i=n+1;i>1;i--) { int u=q[i]; h[u]=0; for(int j=1;j<=K;j++) f[u][j]=g[u][j]=V[u]; for(int k=fst[u];k;k=pre[k]) { for(int j=1;j<K;j++) h[u]=max(h[u],max(abs(f[E[k]][j]-g[u][K-j]),abs(g[E[k]][j]-f[u][K-j]))); for(int j=2;j<K;j++) { f[u][j]=min(f[u][j],f[E[k]][j-1]); g[u][j]=max(g[u][j],g[E[k]][j-1]); } } } h[0]=0; int k=fst[0]; for(int j=2;j<=K;j++) f[0][j]=f[E[k]][j-1],g[0][j]=g[E[k]][j-1]; for(k=pre[k];k;k=pre[k]) { for(int j=1;j<K-1;j++) h[0]=max(h[0],max(abs(f[E[k]][j]-g[0][K-j]),abs(g[E[k]][j]-f[0][K-j]))); for(int j=2;j<K;j++) { f[0][j]=min(f[0][j],f[E[k]][j-1]); g[0][j]=max(g[0][j],g[E[k]][j-1]); } } } void work() { build(); bfs(); dp(); ans=0; for(int i=0;i<=n;i++) ans=max(ans,h[i]); printf("%d\n",ans); } int main() { int TT=get(); for(int i=1;i<=TT;i++) { printf("Case %d: ",i); init(); work(); } return 0; }