#include #include #include #include #include using namespace std; const int MAXN = 200100; const int SIZ = 1<<18; int sum[SIZ * 2 + 100], minBelow[SIZ * 2 + 100]; int loc[MAXN][2]; int n; struct eventtype { int x; int ylow; int yhigh; int typ; eventtype() {} eventtype(int nx, int nylow, int nyhigh, int ntyp) { x = nx; ylow = nylow; yhigh = nyhigh; typ = ntyp; } bool operator < (const eventtype &o) const { return x < o.x; } }; int rect[MAXN][4]; int rt; eventtype event[MAXN * 2]; int et; pair ylist[MAXN * 2]; int yt; void reCalc(int p) { if(p < SIZ) { minBelow[p] = min(minBelow[p * 2], minBelow[p * 2 + 1]); } else { minBelow[p] = 0; } minBelow[p] += sum[p]; } void add(int p, int l, int r, int lGoal, int rGoal, int v) { //if(p < 1 || p >= SIZ * 2) {puts("FUBAR"); exit(0);} if(l == lGoal && r == rGoal) { sum[p] += v; } else { int mid = (l + r) / 2; if(rGoal <= mid) add(p * 2, l, mid, lGoal, rGoal, v); else if(mid < lGoal) add(p * 2 + 1, mid + 1, r, lGoal, rGoal, v); else { add(p * 2, l, mid, lGoal, mid, v); add(p * 2 + 1, mid + 1, r, mid + 1, rGoal, v); } } reCalc(p); } int canEscape(int d) { //printf("Checking %d\n", d); fflush(stdout); yt = 0; rt = 0; for(int i = 0; i < n; ++i) { rect[rt][0] = max(-d, loc[i][0] - d); rect[rt][1] = max(-d, loc[i][1] - d); rect[rt][2] = min(d, loc[i][0] + d) + 1; rect[rt][3] = min(d, loc[i][1] + d) + 1; //printf("%d %d\n", loc[i][0], loc[i][1]); if(rect[rt][0] < rect[rt][2] && rect[rt][1] < rect[rt][3]) { ylist[yt++] = make_pair(rect[rt][1], rt * 4 + 1); ylist[yt++] = make_pair(rect[rt][3], rt * 4 + 3); ++rt; } } ylist[yt++] = make_pair(-d, -1); ylist[yt++] = make_pair(d + 1, -1); sort(ylist, ylist + yt); int ytot = 0; for(int i = 0; i < yt; ++i) { if(i > 0 && ylist[i].first != ylist[i - 1].first) { ytot++; } if(ylist[i].second != -1) { rect[ylist[i].second / 4][ylist[i].second % 4] = ytot; } } //for(int i = 0; i < rt; ++i) printf("(%d %d) - (%d %d)\n", rect[i][0], rect[i][1], rect[i][2], rect[i][3]); et = 0; for(int i = 0; i < rt; ++i) { event[et++] = eventtype(rect[i][0], rect[i][1], rect[i][3] - 1, 1); event[et++] = eventtype(rect[i][2], rect[i][1], rect[i][3] - 1, -1); } sort(event, event + et); if(et == 0) { return 1; } int i = 0; memset(sum, 0, sizeof(sum)); memset(minBelow, 0, sizeof(minBelow)); add(1, 0, SIZ - 1, ytot, SIZ - 1, 1); //printf("%d %d\n", ytot, SIZ - 1); if(event[0].x != -d) { return 1; } while(1) { int x = event[i].x; if(x == d + 1) { //puts("COVERED"); return 0; } while(i < et && event[i].x == x) { //printf("%d: %d %d %d\n", x, event[i].ylow, event[i].yhigh, event[i].typ); fflush(stdout); add(1, 0, SIZ - 1, event[i].ylow, event[i].yhigh, event[i].typ); //printf("%d\n", minBelow[1]); fflush(stdout); ++i; } if(minBelow[1] == 0) { return 1; } } //if(n != 4) {puts("FUBAR"); exit(0);} } int main() { int ct = 0; scanf("%d", &n); while(n != -1) { for(int i = 0; i < n; ++i) { scanf("%d%d", &loc[i][0], &loc[i][1]); } //printf(":::%d\n", canEscape(1)); return 0; ++ct; printf("Case %d: ", ct); if(canEscape(1<<30)) { puts("never"); } else { int ans = 0; int del = 1<<29; while(del) { if(canEscape(ans + del)) { ans += del; } del /= 2; } printf("%d\n", ans + 1); } scanf("%d", &n); } return 0; }