#include <bits/stdc++.h>
using namespace std;
long long rdtsc() {
  long long tmp;
  asm("rdtsc" : "=A"(tmp));
  return tmp;
}
inline int myrand() { return abs((rand() << 15) ^ rand()); }
inline int rnd(int x) { return myrand() % x; }
const int maxn = (int)1e5 + 10;
pair<long long, long long> ps[maxn];
long long pref[maxn + 1][2];
long long suf[maxn + 1][2];
bool check(int n, long long k) {
  int cnt1 = 0, cnt2 = 0;
  while (cnt1 < n || cnt2 < n) {
    bool first = 0;
    if (cnt1 < n && cnt2 < n) {
      long long p1 = ps[cnt1].first - k, p2 = ps[cnt2].first + k;
      if (p1 <= p2) first = 1;
    } else
      first = cnt1 < n;
    if (first) {
      ++cnt1;
    } else {
      ++cnt2;
    }
    if (cnt1 >= cnt2 &&
        max(pref[cnt2][1], suf[cnt1][1]) - min(pref[cnt2][0], suf[cnt1][0]) <=
            2 * k)
      return 1;
  }
  return 0;
}
bool solve() {
  int n;
  if (scanf("%d", &n) < 1) return 0;
  for (int i = 0; i < n; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    ps[i] = make_pair((long long)(x + y) * 2, (long long)(x - y) * 2);
  }
  sort(ps, ps + n);
  pref[0][0] = ((long long)1e18), pref[0][1] = -((long long)1e18);
  for (int i = 0; i < n; ++i) {
    pref[i + 1][0] = min(pref[i][0], ps[i].second);
    pref[i + 1][1] = max(pref[i][1], ps[i].second);
  }
  suf[n][0] = ((long long)1e18), suf[n][1] = -((long long)1e18);
  for (int i = n - 1; i >= 0; --i) {
    suf[i][0] = min(suf[i + 1][0], ps[i].second);
    suf[i][1] = max(suf[i + 1][1], ps[i].second);
  }
  long long l = -1, r = ((long long)1e18);
  while (l + 1 < r) {
    long long k = (l + r) / 2;
    if (check(n, k))
      r = k;
    else
      l = k;
  }
  printf(
      "%lld"
      ".%d\n",
      r / 2, (int)(r % 2) * 5);
  return 1;
}
int main() {
  srand(rdtsc());
  while (1) {
    if (!solve()) break;
  }
  return 0;
}
