Problem: Problem Statement

Circles Island is known for its mysterious shape: it is a completely flat island with its shape being a union of circles whose centers are on the $x$-axis and their inside regions.

The King of Circles Island plans to build a large square on Circles Island in order to celebrate the fiftieth anniversary of his accession. The King wants to make the square as large as possible. The whole area of the square must be on the surface of Circles Island, but any area of Circles Island can be used for the square. He also requires that the shape of the square is square (of course!) and at least one side of the square is parallel to the $x$-axis.

You, a minister of Circles Island, are now ordered to build the square. First, the King wants to know how large the square can be. You are given the positions and radii of the circles that constitute Circles Island. Answer the side length of the largest possible square.

$N$ circles are given in an ascending order of their centers' $x$-coordinates. You can assume that for all $i$ ($1 \le i \le N-1$), the $i$-th and $(i+1)$-st circles overlap each other. You can also assume that no circles are completely overlapped by other circles.

<image>

[fig.1 : Shape of Circles Island and one of the largest possible squares for test case #1 of sample input]

Input

The input consists of multiple datasets. The number of datasets does not exceed $30$. Each dataset is formatted as follows.

> $N$
> $X_1$ $R_1$
> :
> :
> $X_N$ $R_N$

The first line of a dataset contains a single integer $N$ ($1 \le N \le 50{,}000$), the number of circles that constitute Circles Island. Each of the following $N$ lines describes a circle. The $(i+1)$-st line contains two integers $X_i$ ($-100{,}000 \le X_i \le 100{,}000$) and $R_i$ ($1 \le R_i \le 100{,}000$). $X_i$ denotes the $x$-coordinate of the center of the $i$-th circle and $R_i$ denotes the radius of the $i$-th circle. The $y$-coordinate of every circle is $0$, that is, the center of the $i$-th circle is at ($X_i$, $0$).

You can assume the followings.

* For all $i$ ($1 \le i \le N-1$), $X_i$ is strictly less than $X_{i+1}$.
* For all $i$ ($1 \le i \le N-1$), the $i$-th circle and the $(i+1)$-st circle have at least one common point ($X_{i+1} - X_i \le R_i + R_{i+1}$).
* Every circle has at least one point that is not inside or on the boundary of any other circles.



The end of the input is indicated by a line containing a zero.

Output

For each dataset, output a line containing the side length of the square with the largest area. The output must have an absolute or relative error at most $10^{-4}$.

Sample Input


2
0 8
10 8
2
0 7
10 7
0

Output for the Sample Input


12.489995996796796
9.899494936611665





Example

Input

2
0 8
10 8
2
0 7
10 7
0


Output

12.489995996796796
9.899494936611665

Solution (in CPP):

Solution:
#include<bits/stdc++.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define HUGE_NUM 99999999999999999
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


#define NUM 50005

struct Point{
	double x,y;
};

struct Circle{
	Point center;
	double r;
};

struct Info{
	Info(double arg_loc,int arg_value){
		loc = arg_loc;
		value = arg_value;
	}
	bool operator<(const struct Info &arg) const{
		return loc < arg.loc; //場所の昇順
	}
	double loc;
	int value;
};

int N;
Circle circle[NUM];
vector<Info> V;

bool is_ok(double tmp_height){

	V.clear();
	double tmp_diff;

	for(int i = 0; i < N; i++){
		if(2.0*circle[i].r > tmp_height){
			//数直線上でimos
			tmp_diff = sqrt(circle[i].r*circle[i].r-(tmp_height*tmp_height)/4.0);
			V.push_back(Info(circle[i].center.x-tmp_diff,1));
			V.push_back(Info(circle[i].center.x+tmp_diff,-1));
		}
	}

	sort(V.begin(),V.end());

	int tmp_sum = 0;
	double pre_loc = 999999999.0,tmp_max = 0;

	for(int i = 0; i < V.size(); i++){

		if(tmp_sum == 0){ //重み区間外から、左端に遭遇

			pre_loc = V[i].loc;
		}

		tmp_sum += V[i].value;

		if(tmp_sum == 0){ //線分完成
			/*★高さは条件を満たしているので、幅の最大値がtmp_height以上であれば良い★*/
			tmp_max = max(tmp_max,V[i].loc-pre_loc);
		}
	}

	if(tmp_height <= tmp_max){

		return true;

	}else{
		return false;
	}
}

void func(){

	double maximum = 0;

	for(int i = 0; i < N; i++){
		scanf("%lf %lf",&circle[i].center.x,&circle[i].r);
		maximum = max(maximum,2.0*circle[i].r); //仮の最大長
	}

	double left = 0,right = maximum,mid = (left+right)/2.0;
	double ans = -1;

	for(int loop = 0; loop < 50; loop++){

		if(is_ok(mid)){

			ans = mid;
			left = mid+EPS; //より大きく

		}else{

			right = mid-EPS;
		}
		mid = (left+right)/2.0;
	}
	printf("%.10lf\n",ans);
}

int main(){

	while(true){

		scanf("%d",&N);
		if(N == 0)break;

		func();
	}

	return 0;
}