#include #define mp make_pair #define REP(A,B) for(int (A)=0;(A)<(B);(A)++) #define pb push_back using namespace std; long double objem[111111]; long double casy[111111]; long long pritok[111111]; int A[111111]; #define SQN 350 set S; int main() { int n; while(scanf("%d", &n) == 1) { map> Rws, Cls; set< pair > body; REP(i, n) { int x,y; scanf("%d%d", &x, &y); body.insert(mp(y,x)); if(Rws.count(x) == 0) { Rws[x] = vector(); } Rws[x].pb(y); if(Cls.count(y) == 0) { Cls[y] = vector(); } Cls[y].pb(x); } int ans = 0; vector dlouhyR, dlouhyS; for(auto& x : Rws) { int rnum = x.first; if(x.second.size() < SQN) { vector& v = x.second; REP(i, v.size()) for(int j = i+1; j < v.size(); j++) { int D = abs(v[i]-v[j]); if((body.count(mp(v[i], rnum-D)) && body.count(mp(v[j], rnum-D))) || body.count(mp(v[i], rnum+D)) && body.count(mp(v[j], rnum+D))) { ans = max(ans, D); } } } else dlouhyR.pb(rnum); } for(auto& x : Cls) { int colnum = x.first; if(x.second.size() < SQN) { vector& v = x.second; REP(i, v.size()) for(int j = i+1; j < v.size(); j++) { int D = abs(v[i]-v[j]); if((body.count(mp(colnum-D, v[i])) && body.count(mp(colnum-D, v[j]))) || body.count(mp(colnum+D, v[i])) && body.count(mp(colnum+D, v[j]))) { ans = max(ans, D); } } } else dlouhyS.pb(colnum); } for(int i = 0; i < dlouhyR.size(); i++) for(int j = i+1; j < dlouhyR.size(); j++) { for(int k = 0; k < dlouhyS.size(); k++) { int D = abs(dlouhyR[i]-dlouhyR[j]); int s = dlouhyS[k]; int r1 = dlouhyR[i]; int r2 = dlouhyR[j]; if(( body.count(mp(s, r1)) && body.count(mp(s, r2)) && body.count(mp(s+D, r1)) && body.count(mp(s+D, r2)) )) ans = max(ans, D); } } printf("%d\n", ans); } return 0; }