#include <bits/stdc++.h>
using namespace std;
template <class T>
void PV(T a, T b) {
  for (T i = a; i < b; ++i) cout << *i << " ";
  cout << endl;
}
template <class T>
void chmin(T &t, T f) {
  if (t > f) t = f;
}
template <class T>
void chmax(T &t, T f) {
  if (t < f) t = f;
}
const long long inf = 1LL << 60;
int n;
pair<long long, long long> d[100010];
long long x[100010];
long long y[100010];
long long YLMin[100010];
long long YLMax[100010];
long long YRMin[100010];
long long YRMax[100010];
bool canCover(long long w) {
  int j = 0;
  for (int i = 0; i < n; i++) {
    int pos = i;
    for (; j < n; j++) {
      if (x[j] - x[i] <= w)
        pos = j;
      else
        break;
    }
    long long top = -inf;
    long long bottom = inf;
    if (i > 0) {
      chmin(bottom, YLMin[i - 1]);
      chmax(top, YLMax[i - 1]);
    }
    if (pos + 1 < n) {
      chmin(bottom, YRMin[pos + 1]);
      chmax(top, YRMax[pos + 1]);
    }
    if (top - bottom <= w) return 1;
    j = pos;
  }
  return 0;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n;
  for (int i = 0; i < n; i++) {
    long long u, v;
    cin >> u >> v;
    d[i].first = u - v;
    d[i].second = u + v;
  }
  sort(d, d + n);
  for (int i = 0; i < n; i++) x[i] = d[i].first, y[i] = d[i].second;
  for (int i = 0; i < n; i++) {
    YLMin[i] = inf;
    YLMax[i] = -inf;
    YRMin[i] = inf;
    YRMax[i] = -inf;
  }
  for (int i = 0; i < n; i++) {
    if (i > 0) chmin(YLMin[i], YLMin[i - 1]);
    chmin(YLMin[i], y[i]);
    if (i > 0) chmax(YLMax[i], YLMax[i - 1]);
    chmax(YLMax[i], y[i]);
  }
  for (int i = n - 1; i >= 0; i--) {
    if (i != n - 1) chmin(YRMin[i], YRMin[i + 1]);
    chmin(YRMin[i], y[i]);
    if (i != n - 1) chmax(YRMax[i], YRMax[i + 1]);
    chmax(YRMax[i], y[i]);
  }
  long long L = 0, R = 1LL << 35;
  while (L < R) {
    long long M = (L + R) / 2;
    if (canCover(M)) {
      R = M;
    } else {
      L = M + 1;
    }
  }
  printf("%.9lf\n", L / 2.);
  return 0;
}
