#include <bits/stdc++.h>
using namespace std;
const int INF = 1000 * 1000 * 1000;
const int XD = 100000 + 1;
struct point {
  long long x, y;
  void read() {
    long long _x, _y;
    scanf("%I64d%I64d", &_x, &_y);
    x = _x - _y;
    y = _x + _y;
  }
  bool operator<(const point& o) const {
    return x < o.x || x == o.x && y < o.y;
  }
} pts[XD];
long long minYL[XD], maxYL[XD], minYR[XD], maxYR[XD];
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; ++i) {
    pts[i].read();
  }
  sort(pts, pts + n);
  minYL[0] = maxYL[0] = pts[0].y;
  for (int i = 1; i < n; ++i) {
    minYL[i] = min(minYL[i - 1], pts[i].y);
    maxYL[i] = max(maxYL[i - 1], pts[i].y);
  }
  minYR[n - 1] = maxYR[n - 1] = pts[n - 1].y;
  for (int i = n - 2; i >= 0; --i) {
    minYR[i] = min(minYR[i + 1], pts[i].y);
    maxYR[i] = max(maxYR[i + 1], pts[i].y);
  }
  long long lf = 0, rg = 8LL * INF + 1;
  while (lf < rg) {
    long long mid = (lf + rg) >> 1;
    bool check = false;
    int pt = 0;
    for (int i = 0; i < n; ++i) {
      while (pt < n - 1 && pts[pt + 1].x - pts[i].x <= mid) {
        ++pt;
      }
      if (i == 0 && pt == n - 1) {
        check = true;
        break;
      }
      long long maxY = -2 * INF - 1, minY = 2 * INF + 1;
      if (i > 0) {
        maxY = max(maxY, maxYL[i - 1]);
        minY = min(minY, minYL[i - 1]);
      }
      long long a = maxY, b = minY;
      if (pt < n - 1) {
        maxY = max(maxY, maxYR[pt + 1]);
        minY = min(minY, minYR[pt + 1]);
      }
      if (maxY - minY <= mid) {
        check = true;
        break;
      }
    }
    if (check) {
      rg = mid;
    } else {
      lf = mid + 1;
    }
  }
  printf("%.10f", 0.5 * lf);
  return 0;
}
