#include using namespace std; using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector> P(n); ll minU = LLONG_MAX, maxU = LLONG_MIN; ll minV = LLONG_MAX, maxV = LLONG_MIN; for (int i = 0; i < n; i++) { ll x, y; cin >> x >> y; ll u = x + y; ll v = x - y; P[i] = {u, v}; minU = min(minU, u); maxU = max(maxU, u); minV = min(minV, v); maxV = max(maxV, v); } // 一辺 m の正方形2個で覆えるか auto check = [&](ll m) -> bool { // 1人目の正方形を四隅に配置 for (int a = 0; a < 2; a++) { for (int b = 0; b < 2; b++) { ll leftU = (a == 0 ? minU : maxU - m); ll leftV = (b == 0 ? minV : maxV - m); // 1人目が担当できない点の範囲 ll loU = LLONG_MAX, hiU = LLONG_MIN; ll loV = LLONG_MAX, hiV = LLONG_MIN; for (auto [u, v] : P) { // 1人目が担当できる if (leftU <= u && u <= leftU + m && leftV <= v && v <= leftV + m) { continue; } // 2人目が担当する点 loU = min(loU, u); hiU = max(hiU, u); loV = min(loV, v); hiV = max(hiV, v); } // 残りが0点 if (loU == LLONG_MAX) return true; // 残りが一辺 m の正方形に収まる if (hiU - loU <= m && hiV - loV <= m) { return true; } } } return false; }; // 答えの二分探索 ll l = -1; ll r = max(maxU - minU, maxV - minV); while (r - l > 1) { ll m = l + (r - l) / 2; if (check(m)) r = m; else l = m; } cout << r << '\n'; }