#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using Int = long long; template ostream &operator<<(ostream &os, const pair &a) { return os << "(" << a.first << ", " << a.second << ")"; }; template ostream &operator<<(ostream &os, const vector &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; } template void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; } template bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; } template bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; } #define COLOR(s) ("\x1b[" s "m") template struct StaticPointAddRectSum { struct Rect { X x0, x1; Y y0, y1; }; vector> as; vector bs; vector vals, anss; // Adds val to (x, y). void add(X x, Y y, const T &val) { as.emplace_back(x, y); vals.push_back(val); } // Gets sum of [x0, x1) * [y0, y1). // ~~> Gets (x*, y*) void get(X x0, X x1, Y y0, Y y1) { assert(x0 <= x1); assert(y0 <= y1); bs.push_back(Rect{x0, x1, y0, y1}); } void run() { const int asLen = as.size(), bsLen = bs.size(); // same x ==> get then add vector> events((bsLen << 1) + asLen); for (int i = 0; i < asLen; ++i) { events[(bsLen << 1) + i] = std::make_pair(as[i].first, (bsLen << 1) + i); } for (int j = 0; j < bsLen; ++j) { events[j << 1 ] = std::make_pair(bs[j].x0, j << 1 ); events[j << 1 | 1] = std::make_pair(bs[j].x1, j << 1 | 1); } std::sort(events.begin(), events.end()); vector ys(asLen); for (int i = 0; i < asLen; ++i) { ys[i] = as[i].second; } std::sort(ys.begin(), ys.end()); ys.erase(std::unique(ys.begin(), ys.end()), ys.end()); const int ysLen = ys.size(); vector bit(ysLen, 0); anss.assign(bsLen, 0); for (const auto &event : events) { if (event.second >= bsLen << 1) { const int i = event.second - (bsLen << 1); for (int l = std::lower_bound(ys.begin(), ys.end(), as[i].second) - ys.begin(); l < ysLen; l |= l + 1) { bit[l] += vals[i]; } } else { const int j = event.second >> 1; T sum = 0; for (int l = std::lower_bound(ys.begin(), ys.end(), bs[j].y0) - ys.begin(); l > 0; l &= l - 1) { sum -= bit[l - 1]; } for (int l = std::lower_bound(ys.begin(), ys.end(), bs[j].y1) - ys.begin(); l > 0; l &= l - 1) { sum += bit[l - 1]; } (event.second & 1) ? (anss[j] += sum) : (anss[j] -= sum); } } } }; //////////////////////////////////////////////////////////////////////////////// int N; vector X, Y; int minA, maxA, minB, maxB; vector A, B; bool check(Int thr) { StaticPointAddRectSum f; for (int i = 0; i < N; ++i) { const Int mx = max({A[i] - minA, maxA - A[i], B[i] - minB, maxB - B[i]}); if (mx <= thr) { return true; } f.add(A[i], B[i], 1); f.get(A[i] - (mx - thr) + 1, A[i] + (mx - thr), B[i] - (mx - thr) + 1, B[i] + (mx - thr)); } f.run(); for (int i = 0; i < N; ++i) { if (f.anss[i] <= 1) { return true; } } return false; } int main() { for (; ~scanf("%d", &N); ) { X.resize(N); Y.resize(N); for (int i = 0; i < N; ++i) { scanf("%d%d", &X[i], &Y[i]); } A.resize(N); B.resize(N); for (int i = 0; i < N; ++i) { A[i] = X[i] + Y[i]; B[i] = X[i] - Y[i]; } minA = *min_element(A.begin(), A.end()); maxA = *max_element(A.begin(), A.end()); minB = *min_element(B.begin(), B.end()); maxB = *max_element(B.begin(), B.end()); int lo = -1, hi = max(maxA - minA, maxB - minB); for (; lo + 1 < hi; ) { const Int mid = (lo + hi) / 2; (check(mid) ? hi : lo) = mid; } printf("%d\n", hi); } return 0; }