#include <iostream>
#include <cstdio>
#include <math.h>
#include <cassert>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <set>
#include <algorithm>

using namespace std;

const int maxn = 1 << 17;
const int MX = 1e6 + 1;

int n;
int x[maxn], y[maxn];
double dp[maxn];

double d(int i, int j) {
 	return sqrt(1.0 * (x[i] - x[j]) * (x[i] - x[j]) + 1.0 * (y[i] - y[j]) * (y[i] - y[j]));
}

double fastsolve() {
	for (int i = 1; i < n; i++) {
	 	dp[i] = 1e20;
	}
	dp[0] = 0;
	vector<int> v(1, 0);
	for (int i = 1; i < n; i++) {
		dp[i] = 1e20;
		while (!v.empty()) {
		 	dp[i] = min(dp[i], max(dp[v.back()], d(i, v.back())));
			if (y[v.back()] > y[i]) break;
			v.pop_back();
		}
		v.push_back(i);
	}
	return dp[n - 1];
}

int L[maxn], R[maxn];
void findLR() {
	for (int i = 0; i < n; i++) L[i] = R[i] = -1;
	
	vector<int> v;
	for (int i = 0; i < n; i++) {
	 	while (!v.empty() && y[v.back()] < y[i]) {
	 	 	R[v.back()] = i;
			v.pop_back();
		}
		if (!v.empty()) L[i] = v.back();
		if (!v.empty()) {
			L[i] = v.back();
			if (y[i] == y[v.back()]) {
	    	 	R[v.back()] = i;
				v.pop_back();
			}
		}
		v.push_back(i);
	}
}

double wasolve() {
	findLR();

	dp[0] = 0;
	for (int i = 1; i < n; i++) dp[i] = 1e20;

	for (int i = 0; i < n; i++) {
		if (L[i] != -1) dp[i] = min(dp[i], max(dp[L[i]], d(i, L[i])));
		if (R[i] != -1) dp[R[i]] = min(dp[R[i]], max(dp[i], d(i, R[i])));
	}
	return dp[n - 1]; 	
}

void gen() {
 	n = rand() % 100 + 1;
	set<int> st;
	while (st.size() < n) {
	 	int z = rand() % MX;
		if (st.find(z) == st.end()) {
		 	x[st.size()] = z;
			st.insert(z);
		}
	}
	sort(x, x + n);
	for (int i = 0; i < n; i++) {
	 	y[i] = rand() % MX;
	}
}

void stress(bool f) {
	if (!f) return;
	srand(666);
 	for (int it = 0;; it++) {
		gen();
		double ans1 = fastsolve();
		double ans2 = wasolve();
		if (abs(ans1 - ans2) > 1e-6) {
		 	cout << ans1 << " instead of " << ans2 << endl;
			break;
		}
 	 	cerr << it << " " << ans1 << endl;
	}
	exit(0);
}

int main() {
 	freopen("icebergs.in", "r", stdin);
	freopen("icebergs.out", "w", stdout);
	cout.precision(10);
	cout << fixed;

	stress(1);

	cin >> n;
	for (int i = 0; i < n; i++) cin >> x[i] >> y[i];
	cout << fastsolve() << endl;	

	return 0;
}