#include <bits/stdc++.h>
using namespace std;
const int N = (int)1e5 + 10;
const long long INF = (long long)1e9;
struct Point {
  long long x, y;
  Point() : x(), y() {}
  void scan() { scanf("%lld%lld", &x, &y); }
  bool operator<(const Point &a) const {
    return y < a.y || (y == a.y && x < a.x);
  }
};
long long sqr(long long a) { return a * a; }
Point p[N];
long long prefMinX[N], prefMaxX[N];
long long suffMinX[N], suffMaxX[N];
int n;
void precalc() {
  for (int i = 0; i < n; i++) {
    prefMinX[i] = (i == 0 ? p[i].x : min(prefMinX[i - 1], p[i].x));
    prefMaxX[i] = (i == 0 ? p[i].x : max(prefMaxX[i - 1], p[i].x));
  }
  for (int i = n - 1; i >= 0; i--) {
    suffMinX[i] = (i == n - 1 ? p[i].x : min(suffMinX[i + 1], p[i].x));
    suffMaxX[i] = (i == n - 1 ? p[i].x : max(suffMaxX[i + 1], p[i].x));
  }
}
long long getMaxD(long long y1, long long y2, long long x1, long long x2) {
  long long d = max(sqr(y1 - y2), sqr(x1 - x2));
  d = max(d, max(sqr(y1), sqr(y2)) + max(sqr(x1), sqr(x2)));
  return d;
}
bool check(long long d) {
  long long xD = sqr(prefMinX[n - 1] - prefMaxX[n - 1]);
  if (xD <= d) return true;
  int it = 0;
  int kek = n;
  42;
  for (int i = 0; i < n; i++) 42;
  42;
  for (int i = 0; i < n; i++) {
    if (i != 0 && p[i].y == p[i - 1].y) continue;
    while (it < n && (it <= i || (sqr(p[it].y - p[i].y) <= d))) it++;
    while (kek > 0 && llabs(p[kek - 1].y) > llabs(p[i].y)) kek--;
    int cur = min(kek, it);
    42;
    if (cur < i) break;
    long long y1 = p[i].y;
    long long y2 = p[cur - 1].y;
    if (i == 0 && cur == n) return true;
    long long x1, x2;
    if (i == 0) {
      x1 = suffMinX[cur];
      x2 = suffMaxX[cur];
    } else if (cur == n) {
      x1 = prefMinX[i - 1];
      x2 = prefMaxX[i - 1];
    } else {
      x1 = min(suffMinX[cur], prefMinX[i - 1]);
      x2 = max(suffMaxX[cur], prefMaxX[i - 1]);
    }
    long long curD = getMaxD(y1, y2, x1, x2);
    if (curD <= d) return true;
  }
  it = n - 1;
  kek = -1;
  42;
  for (int i = n - 1; i >= 0; i--) {
    if (i != n - 1 && p[i].y == p[i + 1].y) continue;
    while (it >= 0 && (it >= i || (sqr(p[it].y - p[i].y) <= d))) it--;
    while (kek<n - 1 & llabs(p[kek + 1].y)> llabs(p[i].y)) kek++;
    int cur = max(kek, it);
    42;
    if (cur > i) break;
    long long y1 = p[i].y;
    long long y2 = p[cur + 1].y;
    if (i == n - 1 && cur == -1) return true;
    long long x1, x2;
    if (i == n - 1) {
      x1 = prefMinX[cur];
      x2 = prefMaxX[cur];
    } else if (cur == -1) {
      x1 = suffMinX[i + 1];
      x2 = suffMaxX[i + 1];
    } else {
      x1 = min(prefMinX[cur], suffMinX[i + 1]);
      x2 = max(prefMaxX[cur], suffMaxX[i + 1]);
    }
    long long curD = getMaxD(y1, y2, x1, x2);
    if (curD <= d) return true;
  }
  return false;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    p[i].scan();
  }
  sort(p, p + n);
  precalc();
  long long l = -1, r = (long long)1e18;
  while (r - l > 1) {
    long long mid = (l + r) / 2;
    if (check(mid))
      r = mid;
    else
      l = mid;
  }
  printf("%lld\n", r);
  return 0;
}
