#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
using std::bitset;
using namespace std;
struct point {
  long long x, y;
  bool operator<(const point &I) const {
    return x < I.x || (x == I.x && y < I.y);
  }
} a[101000];
long long n;
long long hmi[101000], tmi[101000], hma[101000], tma[101000];
long long judge(double r) {
  long long i, j, tem;
  long long mmi, mma;
  j = 1;
  for (i = 1; i <= n; i++) {
    while (j <= n && a[j].x - a[i].x <= 2 * r) j++;
    mmi = min(hmi[i - 1], tmi[j]);
    mma = max(hma[i - 1], tma[j]);
    if (mma - mmi <= 2 * r) return 1;
  }
  return 0;
}
int main() {
  long long i, j, tem;
  long long tx, ty;
  while (scanf("%I64d", &n) != EOF) {
    for (i = 1; i <= n; i++) {
      scanf("%I64d%I64d", &tx, &ty);
      a[i].x = tx - ty;
      a[i].y = tx + ty;
    }
    sort(a + 1, a + 1 + n);
    hmi[0] = 0x3f3f3f3f3f3f3f3fll;
    hma[0] = -0x3f3f3f3f3f3f3f3fll;
    for (i = 1; i <= n; i++) {
      hmi[i] = min(hmi[i - 1], a[i].y);
      hma[i] = max(hma[i - 1], a[i].y);
    }
    tmi[n + 1] = 0x3f3f3f3f3f3f3f3fll;
    tma[n + 1] = -0x3f3f3f3f3f3f3f3fll;
    for (i = n; i > 0; i--) {
      tmi[i] = min(tmi[i + 1], a[i].y);
      tma[i] = max(tma[i + 1], a[i].y);
    }
    double low, high, mid, ans = 0;
    low = 0;
    high = 1e20;
    while (high - low > 1e-6) {
      mid = (low + high) / 2;
      if (judge(mid))
        high = mid;
      else
        low = mid;
    }
    printf("%.6lf\n", (low + high) / 2);
  }
  return 0;
}
