#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
const double inf = 1e20, eps = 1e-7;
struct point {
  double x, y;
  point() {}
  point(double _x, double _y) {
    x = _x;
    y = _y;
  }
} po[N];
bool compx(point a, point b) {
  if (fabs(a.x - b.x) > eps)
    return a.x < b.x;
  else
    return a.y < b.y;
}
int n;
int ln[N];
double stmin[20][N], stmax[20][N];
void init_rmq() {
  int i, j, k, sk;
  for (i = 0; i < n; i++) stmin[0][i] = po[i].y;
  for (i = 1, k = 2; k < n; i++, k <<= 1) {
    for (j = 0, sk = (k >> 1); j + k - 1 < n; ++j, ++sk) {
      stmin[i][j] = stmin[i - 1][j];
      if (sk < n && stmin[i][j] > stmin[i - 1][sk])
        stmin[i][j] = stmin[i - 1][sk];
    }
  }
  for (i = 0; i < n; i++) stmax[0][i] = po[i].y;
  for (i = 1, k = 2; k < n; i++, k <<= 1) {
    for (j = 0, sk = (k >> 1); j + k - 1 < n; ++j, ++sk) {
      stmax[i][j] = stmax[i - 1][j];
      if (sk < n && stmax[i][j] < stmax[i - 1][sk])
        stmax[i][j] = stmax[i - 1][sk];
    }
  }
}
double querymax(int x, int y) {
  if (x > y) return -inf;
  int b = ln[y - x + 1];
  return max(stmax[b][x], stmax[b][y - (1 << b) + 1]);
}
double querymin(int x, int y) {
  if (x > y) return inf;
  int b = ln[y - x + 1];
  return min(stmin[b][x], stmin[b][y - (1 << b) + 1]);
}
bool check(double ans) {
  for (int ll = 0, rr = 0; rr < n; ll++) {
    while (rr < n && po[rr].x - po[ll].x < ans + eps) rr++;
    if (max(querymax(rr, n - 1), querymax(0, ll - 1)) -
            min(querymin(rr, n - 1), querymin(0, ll - 1)) <
        ans + eps)
      return true;
  }
  return false;
}
int main() {
  for (int i = 2, j = 0, k = 0; j < N; i <<= 1, k++) {
    while (j < i && j < N) {
      ln[j] = k;
      j++;
    }
  }
  double x, y, minx = inf, miny = inf, maxx = -inf, maxy = -inf;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%lf%lf", &x, &y);
    po[i] = point(x + y, x - y);
    minx = min(minx, x + y);
    miny = min(miny, x - y);
    maxx = max(maxx, x + y);
    maxy = max(maxy, x - y);
  }
  sort(po, po + n, compx);
  init_rmq();
  double ll = 0, rr = max(maxx - minx, maxy - miny) * 2.0 + 1.0, mid;
  int cnt = 0;
  while (ll < rr - eps) {
    mid = (ll + rr) / 2.0;
    if (check(mid)) {
      rr = mid;
    } else
      ll = mid + eps;
    cnt++;
    if (cnt == 100) break;
  }
  printf("%lf", ll / 2.0);
  return 0;
}
