#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 5e4 + 5;
struct dot {
int x, y;
dot(int _x = 0, int _y = 0) : x(_x), y(_y) {}
dot operator-(const dot &d) const { return dot(x - d.x, y - d.y); }
int operator*(const dot &d) const { return x * d.y - y * d.x; }
bool operator<(const dot &d) const { return (x == d.x) ? (y > d.y) : (x < d.x); }
} dt[N];
int dis(dot a, dot b) { return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); }
int n, stk[N];
bool use[N];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d%d", &dt[i].x, &dt[i].y);
sort(dt + 1, dt + n + 1);
int tp = 0;
for (int i = 1; i <= n; ++i) {
while (tp >= 2 && (dt[stk[tp - 1]] - dt[stk[tp]]) * (dt[stk[tp]] - dt[i]) > 0) {
use[stk[tp]] = 0;
--tp;
}
use[i] = 1;
stk[++tp] = i;
}
use[1] = 0;
int rec = tp;
for (int i = 1; i <= n; ++i) {
if (use[i]) continue ;
while (tp > rec && (dt[stk[tp - 1]] - dt[stk[tp]]) * (dt[stk[tp]] - dt[i]) > 0)
--tp;
stk[++tp] = i;
}
--tp;
int ans = 0, pt = 1;
for (int i = 1; i <= tp; ++i) {
while (dis(dt[stk[i]], dt[stk[pt % tp + 1]]) >= dis(dt[stk[i]], dt[stk[pt]]))
pt = pt % tp + 1;
ans = max(dis(dt[stk[i]], dt[stk[pt]]), ans);
}
printf("%d\n", ans);
return 0;
}
莫名68分...