#include <bits/stdc++.h>
using namespace std;
int n;
pair<int, int> vec[100010];
pair<int, int> F[100010], R[100010];
bool check(double v) {
  for (int i = 1, j = 1; i <= n; i++) {
    while (j <= n &&
           ((vec[j].first - vec[i].first) + 1e-9 < (v + v)
                ? -1
                : ((vec[j].first - vec[i].first) > 1e-9 + (v + v) ? 1 : 0)) <=
               0)
      j++;
    int miny = (1 << 30), maxy = -(1 << 30);
    miny = min(miny, F[i - 1].second);
    miny = min(miny, R[j].second);
    maxy = max(maxy, F[i - 1].first);
    maxy = max(maxy, R[j].first);
    if (miny == (1 << 30) ||
        ((maxy - miny) + 1e-9 < (v + v)
             ? -1
             : ((maxy - miny) > 1e-9 + (v + v) ? 1 : 0)) <= 0)
      return true;
  }
  return false;
}
int main() {
  cin >> n;
  R[n + 1] = F[0] = make_pair(-(1 << 30), (1 << 30));
  for (__typeof(n) i = 0; i < (n); i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    vec[i + 1] = (pair<int, int>(x + y, x - y));
  }
  sort(vec + 1, vec + n + 1);
  for (int i = 1, j = n; i <= n; i++, j--) {
    F[i] = make_pair(vec[i].second, vec[i].second);
    F[i].first = max(F[i].first, F[i - 1].first);
    F[i].second = min(F[i].second, F[i - 1].second);
    R[j] = make_pair(vec[j].second, vec[j].second);
    R[j].first = max(R[j].first, R[j + 1].first);
    R[j].second = min(R[j].second, R[j + 1].second);
  }
  double lo = 0, hi = 1e10, ans = hi;
  int stp = 200;
  while (stp--) {
    double mid = (lo + hi) / 2.0;
    if (check(mid))
      ans = min(ans, mid), hi = mid;
    else
      lo = mid;
  }
  printf("%.8lf\n", ans);
  return 0;
}
