#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
const int INF = 1e8 + 7;
int n;
int Min[N][20], Max[N][20];
struct Node {
  int x, y;
  bool operator<(const Node& p) const { return x < p.x; }
} nod[N];
long long sqr(long long x) { return x * x; }
void rmq() {
  for (int i = 0; i < n; ++i) {
    Min[i][0] = nod[i].y;
    Max[i][0] = nod[i].y;
  }
  for (int j = 1; (1 << j) <= n; ++j)
    for (int i = 0; i + (1 << j) - 1 < n; ++i) {
      Min[i][j] = min(Min[i][j - 1], Min[i + (1 << (j - 1))][j - 1]);
      Max[i][j] = max(Max[i][j - 1], Max[i + (1 << (j - 1))][j - 1]);
    }
}
int query(int t, int l, int r) {
  if (l > r) return (1 - (t << 1)) * INF;
  int k = (int)log2(r - l + 1.0);
  switch (t) {
    case 0:
      return min(Min[l][k], Min[r - (1 << k) + 1][k]);
    case 1:
      return max(Max[l][k], Max[r - (1 << k) + 1][k]);
  }
  return 0;
}
bool isok(long long D, long long x, long long ymin, long long ymax) {
  if (x > D) return false;
  if (ymin != -INF && x + sqr(ymin) > D) return false;
  if (ymax != INF && x + sqr(ymax) > D) return false;
  if (ymin != -INF && ymax != INF && sqr(ymax - ymin) > D) return false;
  return true;
}
bool check(long long D) {
  if (sqr(nod[n - 1].x - nod[0].x) <= D) return true;
  if (sqr(query(1, 0, n - 1) - query(0, 0, n - 1)) <= D) return true;
  int l = 0, r = n - 1, ymin, ymax;
  r = 0;
  for (int i = 0; i < n; ++i) {
    if (r < i) r = i;
    while (r + 1 < n && abs(nod[r + 1].x) <= abs(nod[i].x) &&
           sqr(nod[r + 1].x - nod[i].x) <= D)
      ++r;
    while (abs(nod[r].x) > abs(nod[i].x)) --r;
    l = i;
    ymin = min(query(0, 0, l - 1), query(0, r + 1, n - 1));
    ymax = max(query(1, 0, l - 1), query(1, r + 1, n - 1));
    long long x = sqr(nod[l].x);
    if (isok(D, x, ymin, ymax)) return true;
  }
  l = 0, r = n - 1;
  l = n - 1;
  for (int i = n - 1; i >= 0; --i) {
    if (l > i) l = i;
    while (l - 1 >= 0 && abs(nod[l - 1].x) <= abs(nod[i].x) &&
           sqr(nod[l - 1].x - nod[i].x) <= D)
      --l;
    while (abs(nod[l].x) > abs(nod[i].x)) ++l;
    r = i;
    ymin = min(query(0, 0, l - 1), query(0, r + 1, n - 1));
    ymax = max(query(1, 0, l - 1), query(1, r + 1, n - 1));
    long long x = max(sqr(nod[l].x), sqr(nod[r].x)),
              y = max(sqr(ymin), sqr(ymax));
    if (isok(D, x, ymin, ymax)) return true;
  }
  return false;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; ++i) {
    scanf("%d%d", &nod[i].x, &nod[i].y);
  }
  sort(nod, nod + n);
  rmq();
  long long L = 0, R = sqr(nod[n - 1].x - nod[0].x);
  while (L + 1 < R) {
    long long M = (L + R) >> 1;
    check(M) ? R = M : L = M;
  }
  long long ans = check(L) ? L : R;
  printf("%I64d", ans);
  return 0;
}
