func_code_string: #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;   }   