#include <bits/stdc++.h>
using namespace std;
struct point {
  double x, y;
  void in() {
    scanf("%lf%lf", &x, &y);
    double xx = x, yy = y;
    x = xx + yy, y = xx - yy;
  }
};
bool operator<(point a, point b) { return a.y < b.y; }
vector<point> vp;
int n;
double biga[65536 * 2], sma[65536 * 2], bigb[65536 * 2], smb[65536 * 2];
int solve(double dist) {
  int j = 0;
  int ti = -1;
  for (int i = 0; i < vp.size(); i++) {
    if (fabs(vp[i].y - vp[j].y) <= dist * 2)
      ;
    else {
      ti = i;
      break;
    }
  }
  if (ti == -1) return 1;
  if (biga[ti] - sma[ti] <= dist * 2) return 1;
  while (ti < vp.size()) {
    j++;
    while (ti < vp.size() and fabs(vp[ti].y - vp[j].y) <= dist * 2) ti++;
    if (ti == vp.size() and bigb[j - 1] - smb[j - 1] <= dist * 2) return 1;
    if (max(biga[ti], bigb[j - 1]) - min(sma[ti], smb[j - 1]) <= dist * 2)
      return 1;
  }
  return 0;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    point p;
    p.in();
    vp.push_back(p);
  }
  sort(vp.begin(), vp.end());
  sma[0] = vp[0].x, biga[0] = vp[0].x;
  for (int i = 1; i < vp.size(); i++)
    sma[i] = min(sma[i - 1], vp[i].x), biga[i] = max(biga[i - 1], vp[i].x);
  swap(sma, smb);
  swap(biga, bigb);
  sma[vp.size() - 1] = vp[vp.size() - 1].x,
                  biga[vp.size() - 1] = vp[vp.size() - 1].x;
  for (int i = vp.size() - 2; i >= 0; i--)
    sma[i] = min(sma[i + 1], vp[i].x), biga[i] = max(biga[i + 1], vp[i].x);
  double l = 0, r = 1000000000;
  double ans;
  int tms = 100;
  while (tms--) {
    double mid = (l + r) / 2;
    if (solve(mid))
      r = mid, ans = mid;
    else
      l = mid;
  }
  if (solve(0)) ans = 0;
  double anss = ans;
  printf("%.12lf\n", anss);
  return 0;
}
