N = int(input()) P = [tuple(map(int, input().split())) for _ in range(N)] P = [(x + y, x - y) for x, y in P] mi = min(P, key=lambda a: a[0])[0] ma = max(P, key=lambda a: a[0])[0] l = -1 r = 1 << 31 while r - l > 1: m = (l + r) // 2 d = m / 2 x1 = mi + d x2 = ma - d left = [] both = [] right = [] ok = True for x, y in P: a = abs(x - x1) <= d b = abs(x - x2) <= d if a and b: both.append(y) elif a: left.append(y) elif b: right.append(y) else: ok = False break if left and max(left) - min(left) > 2 * d: ok = False if right and max(right) - min(right) > 2 * d: ok = False if not ok: l = m continue def bound(x: list[int]): return () if not x else (min(x) + d, max(x) - d) ok = False for y1 in bound(left) + bound(both): if ok: break for y2 in bound(right) + bound(both): if all(abs(y - y1) <= d for y in left) and all(abs(y - y2) <= d for y in right) and \ all(min(abs(y - y1), abs(y - y2)) <= d for y in both): ok = True r = m break if not ok: l = m print(r)