#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
struct data {
  long long x, y;
} a[N];
long long Lm[N], Ln[N], Rm[N], Rn[N];
int n;
bool cmp(data xx, data yy) {
  if (xx.x != yy.x)
    return xx.x < yy.x;
  else
    return xx.y < yy.y;
}
bool check(long long dis) {
  int lt = 1;
  for (int i = 1; i <= n; ++i) {
    while (lt + 1 <= n && a[lt + 1].x <= dis + a[i].x) lt++;
    long long maxn = -2000000000, minn = 2000000000;
    if (i != 1) maxn = Lm[i], minn = Ln[i];
    if (lt != n) maxn = max(maxn, Rm[lt]), minn = min(minn, Rn[lt]);
    if (i == 1 && lt == n) maxn = 0, minn = 0;
    if (maxn - minn <= dis) return true;
  }
  return false;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    long long x, y;
    scanf("%lld%lld", &x, &y);
    a[i].x = x - y, a[i].y = x + y;
  }
  sort(a + 1, a + 1 + n, cmp);
  long long maxn = -2000000000, minn = 2000000000;
  for (int i = 1; i <= n; ++i) {
    Lm[i] = maxn, Ln[i] = minn;
    minn = min(a[i].y, minn);
    maxn = max(a[i].y, maxn);
  }
  maxn = -2000000000, minn = 2000000000;
  for (int i = n; i >= 1; --i) {
    Rm[i] = maxn, Rn[i] = minn;
    minn = min(a[i].y, minn);
    maxn = max(a[i].y, maxn);
  }
  long long ans = -1, l = 0, r = 2000000000;
  while (l <= r) {
    long long mid = (l + r) >> 1;
    if (check(mid))
      ans = mid, r = mid - 1;
    else
      l = mid + 1;
  }
  printf("%.12f\n", double(ans) / (2.0));
  return 0;
}
