#include <bits/stdc++.h>
using namespace std;
const double INF = 1e10;
const double eps = 1e-6;
const int N = 100010;
int x[N], y[N];
struct Node {
  int d, p;
  Node(int _d = 0, int _p = 0) : d(_d), p(_p) {}
  bool operator<(const Node& nd) const { return d < nd.d; }
};
Node nd[N];
int n;
int min_s[N], max_s[N];
int min_e[N], max_e[N];
bool check(double D) {
  for (int i = 0, j = 0; i < n; ++i) {
    while (j < n && (double)nd[j].d - nd[i].d <= D) ++j;
    double mx = max(i ? max_s[i - 1] : -INF, j < n ? max_e[j] : -INF);
    double mn = min(i ? min_s[i - 1] : INF, j < n ? min_e[j] : INF);
    if (mx - mn <= D) return true;
  }
  return false;
}
int main() {
  ios_base::sync_with_stdio(false);
  while (cin >> n) {
    for (int i = 0; i < n; ++i) {
      cin >> x[i] >> y[i];
      nd[i] = Node(x[i] - y[i], x[i] + y[i]);
    }
    sort(nd, nd + n);
    min_s[0] = max_s[0] = nd[0].p;
    min_e[n - 1] = max_e[n - 1] = nd[n - 1].p;
    for (int i = 1; i < n; ++i) {
      min_s[i] = min(min_s[i - 1], nd[i].p);
      max_s[i] = max(max_s[i - 1], nd[i].p);
      min_e[n - 1 - i] = min(min_e[n - i], nd[n - i - 1].p);
      max_e[n - 1 - i] = max(max_e[n - i], nd[n - i - 1].p);
    }
    double l = 0.0, r = INF;
    while (l + eps < r) {
      double mid = 0.5 * (l + r);
      if (check(mid))
        r = mid;
      else
        l = mid;
    }
    cout.precision(7);
    cout << std::fixed << l * 0.5 << endl;
  }
  return 0;
}
