#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

struct Point {
    ll x, y;
};

// 计算两点距离的平方
ll dist2(const Point& a, const Point& b) {
    ll dx = a.x - b.x;
    ll dy = a.y - b.y;
    return dx * dx + dy * dy;
}

// 按 y 坐标归并排序两个已排序的区间 [l, mid] 和 [mid+1, r]
void mergeByY(vector<Point>& pts, int l, int mid, int r) {
    vector<Point> temp(r - l + 1);
    int i = l, j = mid + 1, k = 0;
    
    // 合并两个有序序列
    while (i <= mid && j <= r) {
        if (pts[i].y <= pts[j].y) {
            temp[k++] = pts[i++];
        } else {
            temp[k++] = pts[j++];
        }
    }
    
    // 处理剩余元素
    while (i <= mid) temp[k++] = pts[i++];
    while (j <= r) temp[k++] = pts[j++];
    
    // 复制回原数组
    for (int idx = 0; idx < (int)temp.size(); idx++) {
        pts[l + idx] = temp[idx];
    }
}

// 分治求解最近点对距离平方
ll closestPair(vector<Point>& pts, int l, int r) {
    // 递归终止:区间内点数 <= 3,直接暴力求解
    if (r - l <= 2) {
        ll minDist = LLONG_MAX;
        for (int i = l; i <= r; i++) {
            for (int j = i + 1; j <= r; j++) {
                minDist = min(minDist, dist2(pts[i], pts[j]));
            }
        }
        // 按 y 排序这个小段,为上层归并做准备
        sort(pts.begin() + l, pts.begin() + r + 1, 
             [](const Point& a, const Point& b) { return a.y < b.y; });
        return minDist;
    }
    
    // 分治
    int mid = (l + r) / 2;
    ll midX = pts[mid].x;
    
    // 递归求解左右两半
    ll leftMin = closestPair(pts, l, mid);
    ll rightMin = closestPair(pts, mid + 1, r);
    ll minDist = min(leftMin, rightMin);
    
    // 归并:将左右两半按 y 合并,使 [l, r] 按 y 有序
    mergeByY(pts, l, mid, r);
    
    /*如果 x 差平方已经比当前最优距离平方还大,
      那就算 y 差为 0,整个距离也 ≥ 这个值,
      不可能更新最优解 → 直接不加入 strip */
    vector<Point> strip;
    for (int i = l; i <= r; i++) {
        ll dx = pts[i].x - midX;
        if (dx * dx < minDist) {
            strip.push_back(pts[i]);
        }
    }
    
    // 检查中缝带内的点对(strip 已按 y 有序)
    for (int i = 0; i < (int)strip.size(); i++) {
        for (int j = i + 1; j < (int)strip.size(); j++) {
            //同上,y差方大则不用比了
            ll dy = strip[j].y - strip[i].y;
            if (dy * dy >= minDist) break;
           
            minDist = min(minDist, dist2(strip[i], strip[j]));
        }
    }
    
    return minDist;
}

int main() {
    int n;
    cin >> n;
    
    vector<Point> pts(n);
    for (int i = 0; i < n; i++) {
        cin >> pts[i].x >> pts[i].y;
    }
    
    // 按 x 坐标排序
    sort(pts.begin(), pts.end(), 
         [](const Point& a, const Point& b) { return a.x < b.x; });
    
    // 求解并输出
    cout << closestPair(pts, 0, n - 1) << "\n";
    
    return 0;
}