#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
struct Point {
  int x, y;
  void read() {
    int a, b;
    scanf("%d%d", &a, &b);
    x = a + b;
    y = a - b;
  }
  bool operator<(const Point p) const { return x != p.x ? x < p.x : y < p.y; }
} p[N];
int n;
int pre_min[N], pre_max[N];
int suf_min[N], suf_max[N];
bool check(long long mid) {
  for (int l = 1, r = 1; r <= n; r++) {
    while (p[r].x - p[l].x > mid && l <= n) l++;
    int mx = max(pre_max[l - 1], suf_max[r + 1]);
    int mn = min(pre_min[l - 1], suf_min[r + 1]);
    if (mx - mn <= mid) return true;
  }
  return false;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) p[i].read();
  sort(p + 1, p + 1 + n);
  pre_min[0] = INT_MAX;
  pre_max[0] = INT_MIN;
  suf_min[n + 1] = INT_MAX;
  suf_max[n + 1] = INT_MIN;
  for (int i = 1; i <= n; i++) {
    pre_max[i] = max(pre_max[i - 1], p[i].y);
    pre_min[i] = min(pre_min[i - 1], p[i].y);
  }
  for (int i = n; i >= 1; i--) {
    suf_max[i] = max(suf_max[i + 1], p[i].y);
    suf_min[i] = min(suf_min[i + 1], p[i].y);
  }
  long long ans, low = 0, high = 1LL << 50, mid;
  while (low <= high) {
    mid = (low + high) >> 1;
    if (check(mid))
      high = mid - 1, ans = mid;
    else
      low = mid + 1;
  }
  printf("%.10f\n", ans / 2.0);
  return 0;
}
