#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;
const long long inf = 1e16;
const int iterations = 100;
pair<long long, long long> trans(long long x, long long y) {
  return make_pair(x + y, x - y);
}
int n;
pair<long long, long long> A[maxn];
long long minsuf[maxn];
long long maxsuf[maxn];
long long minpref[maxn];
long long maxpref[maxn];
bool valid(long double x) {
  int j = 1;
  for (int i = (1); i <= (n); i++) {
    while (j + 1 <= n && A[j + 1].first <= A[i].first + x + x) j++;
    long long mx = max(maxpref[i - 1], maxsuf[j + 1]);
    long long mn = min(minpref[i - 1], minsuf[j + 1]);
    if (mx - mn <= x + x) return true;
  }
  return false;
}
int main() {
  scanf("%d", &n);
  for (int i = (1); i <= (n); i++) {
    long long x, y;
    scanf("%lld", &x);
    scanf("%lld", &y);
    A[i] = trans(x, y);
  }
  sort(A + 1, A + n + 1);
  minsuf[n + 1] = minpref[0] = inf;
  maxsuf[n + 1] = maxpref[0] = -inf;
  for (int i = 1, j = n; i <= n; i++, j--) {
    minpref[i] = min(minpref[i - 1], A[i].second);
    minsuf[j] = min(minsuf[j + 1], A[j].second);
    maxpref[i] = max(maxpref[i - 1], A[i].second);
    maxsuf[j] = max(maxsuf[j + 1], A[j].second);
  }
  long double l = 0.0, r = 1.0 * inf;
  for (int iter = (1); iter <= (iterations); iter++) {
    long double mid = (l + r) / 2;
    if (valid(mid)) {
      r = mid;
    } else {
      l = mid;
    }
  }
  cout << setprecision(12) << fixed << l << endl;
}
