#include <bits/stdc++.h>
using namespace std;
const int maxn = 105000;
const long long INF = 0x7FFFFFFFFFFFFFFFLL;
struct Point {
  long long x, y;
} p[maxn];
inline bool operator<(Point A, Point B) {
  return A.x == B.x ? A.y < B.y : A.x < B.x;
}
map<long long, long long> coor;
long long premax[maxn], premin[maxn], sufmax[maxn], sufmin[maxn];
int n;
inline bool check(long long k) {
  for (int i = 1; i <= n; ++i) {
    int p1, p2;
    auto gy = coor.lower_bound(p[i].x);
    if (gy == coor.begin())
      p1 = 0;
    else {
      --gy;
      p1 = gy->second;
    }
    gy = coor.upper_bound(p[i].x + k);
    gy--;
    p2 = gy->second + 1;
    if (max(premax[p1], sufmax[p2]) - min(premin[p1], sufmin[p2]) <= k)
      return true;
  }
  return false;
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    long long x, y;
    cin >> x >> y;
    p[i].x = x + y;
    p[i].y = x - y;
  }
  sort(p + 1, p + n + 1);
  premax[0] = -INF;
  premin[0] = INF;
  for (int i = 1; i <= n; ++i) {
    premax[i] = max(p[i].y, premax[i - 1]);
    premin[i] = min(p[i].y, premin[i - 1]);
  }
  sufmax[n + 1] = -INF;
  sufmin[n + 1] = INF;
  for (int i = n; i; --i) {
    sufmax[i] = max(p[i].y, sufmax[i + 1]);
    sufmin[i] = min(p[i].y, sufmin[i + 1]);
  }
  for (int i = 1; i <= n; ++i) coor[p[i].x] = i;
  long long llim = 0, rlim = 200000000000LL, mid;
  while (rlim - llim > 1) {
    mid = (llim + rlim) / 2;
    if (check(mid))
      rlim = mid;
    else
      llim = mid;
  }
  if (!check(llim)) llim = rlim;
  cout << fixed << setprecision(10) << static_cast<double>(llim) / 2.0 << endl;
  return 0;
}
