Problem: You are on board a trading ship as a crew.

The ship is now going to pass through a strait notorious for many pirates often robbing ships. The Maritime Police has attempted to expel those pirates many times, but failed their attempts as the pirates are fairly strong. For this reason, every ship passing through the strait needs to defend themselves from the pirates.

The navigator has obtained a sea map on which the location of every hideout of pirates is shown. The strait is considered to be a rectangle of W × H on an xy-plane, where the two opposite corners have the coordinates of (0, 0) and (W, H). The ship is going to enter and exit the strait at arbitrary points on y = 0 and y = H respectively.

To minimize the risk of attack, the navigator has decided to take a route as distant from the hideouts as possible. As a talented programmer, you are asked by the navigator to write a program that finds the best route, that is, the route with the maximum possible distance to the closest hideouts. For simplicity, your program just needs to report the distance in this problem.



Input

The input begins with a line containing three integers W, H, and N. Here, N indicates the number of hideouts on the strait. Then N lines follow, each of which contains two integers xi and yi, which denote the coordinates the i-th hideout is located on.

The input satisfies the following conditions: 1 ≤ W, H ≤ 109, 1 ≤ N ≤ 500, 0 ≤ xi ≤ W, 0 ≤ yi ≤ H.

Output

There should be a line containing the distance from the best route to the closest hideout(s). The distance should be in a decimal fraction and should not contain an absolute error greater than 10-3.

Example

Input




Output

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const int N = 510;
const double eps = 1e-4;
int w, h, n;
struct Point
{
	double x, y;
	void in(){scanf("%lf%lf", &x, &y);}
}p[N];
inline int sgn(double x){return x < -eps ? -1 : x > eps ? 1 : 0;}
struct edge{int next, to;} e[N*N];
int head[N], tot;
void gInit(){memset(head, -1, sizeof(head)); tot = 0;}
void add_edge(int u,int v){e[tot] = (edge){head[u], v}; head[u] = tot++;}
bool vis[N];
double dist(const Point &a, const Point &b)
{
	return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
bool solve(double x)
{
	gInit();
	for(int i = 1; i <= n; ++i)
		if(sgn(p[i].x - x) < 0)
			add_edge(0, i);
	for(int i = 1; i <= n; ++i)
		for(int j = i + 1; j <= n; ++j)
			if(sgn(dist(p[i], p[j]) - x - x) < 0)
			{
				add_edge(i, j);
				add_edge(j, i);
			}
	for(int i = 1; i <= n; ++i)
		if(sgn(w - p[i].x - x) < 0)
			add_edge(i, n + 1);
	queue<int> que;
	que.push(0);
	memset(vis, false, sizeof(vis));
	vis[0] = true;
	while(!que.empty())
	{
		int u = que.front(); que.pop();
		for(int i = head[u]; ~i; i = e[i].next)
			if(!vis[e[i].to])
			{
				vis[e[i].to] = true;
				que.push(e[i].to);
			}
	}
	if(vis[n + 1]) return false;
	//check start point and end point
/*	Point w0 = (Point){w, 0};
	Point wh = (Point){w, h};
	for(int i = 1; i <= n; ++i)
	{
		if(!vis[i]) continue;
		if(sgn(dist(w0, p[i]) - x) <= 0) return false;
		if(sgn(dist(wh, p[i]) - x) <= 0) return false;
	}
*/
	return true;
}
int main()
{
	scanf("%d%d%d", &w, &h, &n);
	for(int i = 1; i <= n; ++i) p[i].in();
	double l = 0, r = 1e10, mid, ans = 0.0;
	for(int i = 0; i < 100; ++i)
	{
		mid = 0.5 * (l + r);
		if(solve(mid))
		{
			ans = mid;
			l = mid;
		}
		else
		{
			r = mid;
		}
	}
	printf("%.3f", ans);
	return 0;
}