#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <float.h>
#define INPUT "cmap.in"
#define OUTPUT "cmap.out"
#define MAX 100000
#define SUCCESS 0
typedef struct coord {
int x, y;
} coord;
int compare_y(const void* a, const void* b) {
int ya = ((coord*) a)->y, yb = ((coord*) b)->y;
if (ya == yb) {
return 0;
} else {
return ya < yb ? -1 : 1;
}
}
int compare_x(const void* a, const void* b) {
int xa = ((coord*) a)->x, xb = ((coord*) b)->x;
if (xa == xb) {
return compare_y(a, b);
} else {
return xa < xb ? -1 : 1;
}
}
double distance(coord a, coord b) {
return sqrt(pow((double) a.x - b.x, 2) + pow((double) a.y - b.y, 2));
}
coord y[MAX], yfull[MAX];
double find_min(coord* a, int l, int r) {
double minim;
if (r - l + 1 <= 3) {
int i;
minim = DBL_MAX;
while (l <= r) {
for (i = l + 1; i <= r; i++) {
minim = fmin(minim, distance(a[l], a[i]));
}
l++;
}
qsort(a + l, r - l + 1, sizeof(coord), compare_y);
} else {
int m = (l + r) / 2;
double delim = ((double) a[m].x + a[m + 1].x) / 2;
minim = fmin(find_min(a, l, m), find_min(a, m + 1, r));
int n = 0, k = 0, i = l, j = m + 1;
while (i <= m && j <= r) {
if (a[i].y < a[j].y) {
yfull[n++] = a[i++];
} else {
yfull[n++] = a[j++];
}
}
while (i <= m) {
yfull[n++] = a[i++];
}
while (j <= r) {
yfull[n++] = a[j++];
}
for (i = 0; i < n; i++) {
if (fabs(yfull[i].x - delim) <= minim) {
y[k++] = yfull[i];
}
a[l + i] = yfull[i];
}
for (i = 0; i < k; i++) {
for (j = i + 1; j <= i + 7 && j < k; j++) {
minim = fmin(minim, distance(y[i], y[j]));
}
}
}
return minim;
}
int main() {
FILE *f = fopen(INPUT, "r");
coord a[MAX];
int n, i;
fscanf(f, "%d", &n);
for (i = 0; i < n; i++) {
fscanf(f, "%d %d", &a[i].x, &a[i].y);
}
fclose(f);
qsort(a, n, sizeof(coord), compare_x);
f = fopen(OUTPUT, "w");
fprintf(f, "%f\n", find_min(a, 0, n - 1));
fclose(f);
return SUCCESS;
}