#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:100000000,100000000")
using namespace std;
const long long inf = 1e18 + 7;
const long long mod = 1e9 + 7;
const double eps = 1e-9;
const double PI = 2 * acos(0.0);
const double E = 2.71828;
long long n;
struct pt {
  long long x, y;
  void rotare() {
    long long p = x;
    x = p + y;
    y = p - y;
  }
  friend bool operator<(pt a, pt b) {
    return a.x < b.x || (a.x == b.x && a.y < b.y);
  }
  friend bool operator==(pt a, pt b) { return a.x == b.x && a.y == b.y; }
} a[100005];
long long MaxL[100005], MaxR[100005], MinL[100005], MinR[100005];
inline bool ok(long long x) {
  for (long long(l) = 0; (l) < (long long)(n); (l)++) {
    pt toFind;
    toFind.x = a[l].x + x;
    toFind.y = inf;
    long long r = upper_bound(a, a + n, toFind) - a;
    long long Min = inf, Max = -inf;
    bool atLeast = 0;
    if (l) {
      Min = min(Min, MinL[l - 1]);
      Max = max(Max, MaxL[l - 1]);
      atLeast = 1;
    }
    if (r < n) {
      Min = min(Min, MinR[r]);
      Max = max(Max, MaxR[r]);
      atLeast = 1;
    }
    if (!atLeast) return true;
    if (Max - Min <= x) return true;
  }
  return false;
}
int main(void) {
  cin >> n;
  for (long long(i) = 0; (i) < (long long)(n); (i)++) {
    cin >> a[i].x >> a[i].y;
    a[i].rotare();
  }
  sort(a, a + n);
  MaxL[0] = MinL[0] = a[0].y;
  MaxR[n - 1] = MinR[n - 1] = a[n - 1].y;
  for (long long i = 1; i < n; i++) {
    MaxL[i] = max(MaxL[i - 1], a[i].y);
    MinL[i] = min(MinL[i - 1], a[i].y);
  }
  for (long long i = n - 2; i >= 0; i--) {
    MaxR[i] = max(MaxR[i + 1], a[i].y);
    MinR[i] = min(MinR[i + 1], a[i].y);
  }
  long long l = 0, r = inf, ans = inf;
  while (l <= r) {
    long long m = (l + r) >> 1LL;
    if (ok(m))
      r = m - 1, ans = m;
    else
      l = m + 1;
  }
  cout << setprecision(9) << fixed << ans / 2.0 << endl;
  return 0;
}
