#include <bits/stdc++.h>
using namespace std;
const int inf = ((1 << 30) - 1);
const long long linf = ((1ll << 60) - 1);
const int cmax = 100500;
int n;
long long x[cmax], y[cmax];
vector<pair<long long, int> > a, b;
int inv[cmax];
long long rmqMax[cmax * 4], rmqMin[cmax * 4];
int wh[cmax];
void make_rmq(int i, int l, int r) {
  if (l == r) {
    rmqMax[i] = b[l].first, rmqMin[i] = b[l].first;
    wh[l] = i;
    return;
  }
  make_rmq(i * 2, l, (l + r) / 2);
  make_rmq(i * 2 + 1, (l + r) / 2 + 1, r);
  rmqMax[i] = max(rmqMax[i * 2], rmqMax[i * 2 + 1]);
  rmqMin[i] = min(rmqMin[i * 2], rmqMin[i * 2 + 1]);
}
void update(int pos, long long minVal, long long maxVal) {
  int i = wh[pos];
  rmqMax[i] = maxVal, rmqMin[i] = minVal;
  i >>= 1;
  while (i > 0) {
    rmqMax[i] = max(rmqMax[i * 2], rmqMax[i * 2 + 1]);
    rmqMin[i] = min(rmqMin[i * 2], rmqMin[i * 2 + 1]);
    i >>= 1;
  }
}
void add(int v) { update(v, b[v].first, b[v].first); }
void remove(int v) { update(v, linf, -linf); }
inline bool check(long long x) {
  int it = 0;
  make_rmq(1, 0, n - 1);
  for (int i = 0; i < ((int)(a).size()); i++) {
    remove(inv[a[i].second]);
    while (abs(a[i].first - a[it].first) > x) add(inv[a[it++].second]);
    if (rmqMax[1] - rmqMin[1] <= x) return true;
  }
  return false;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n;
  for (int i = 0; i < n; i++) cin >> x[i] >> y[i];
  for (int i = 0; i < n; i++)
    a.push_back(make_pair(y[i] - x[i], i)),
        b.push_back(make_pair(x[i] + y[i], i));
  sort((a).begin(), (a).end()), sort((b).begin(), (b).end());
  for (int i = 0; i < n; i++) inv[b[i].second] = i;
  long long l = -1, r = 1e+12;
  while (r - l > 1) {
    long long m = (l + r) / 2;
    if (check(m))
      r = m;
    else
      l = m;
  }
  cout.precision(20);
  cout << fixed << 1.0 * r / 2 << '\n';
  return 0;
}
