#include <bits/stdc++.h>
using namespace std;
int n;
pair<long long, long long> ls[200100];
long long mini[200100], maxi[200100];
bool pode(long long d) {
  bool pode = false;
  int p1 = 0;
  long long ma = -ls[0].second, mi = -ls[0].second;
  for (int i = 0; i < n; i++) {
    long long xx = ls[i].first;
    while (i < n && xx == ls[i].first) i++;
    i--;
    while (xx - ls[p1].first > d) {
      ma = max(ma, -ls[p1].second);
      mi = min(mi, -ls[p1].second);
      p1++;
    }
    if (i == n - 1 && p1 == 0)
      pode = true;
    else if (i == n - 1) {
      if (ma - mi <= d) pode = true;
    } else if (p1 == 0) {
      if (maxi[i + 1] - mini[i + 1] <= d) pode = true;
    } else {
      if (max(maxi[i + 1], ma) - min(mini[i + 1], mi) <= d) pode = true;
    }
  }
  return pode;
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    long long x, y;
    cin >> x >> y;
    x = x + y;
    y = x - 2 * y;
    ls[i] = make_pair(y, x);
  }
  sort(ls, ls + n);
  mini[n - 1] = -ls[n - 1].second, maxi[n - 1] = -ls[n - 1].second;
  for (int i = n - 2; i >= 0; i--)
    mini[i] = min(mini[i + 1], -ls[i].second),
    maxi[i] = max(maxi[i + 1], -ls[i].second);
  long long l1 = 0, l2 = 3000000000LL;
  while (l1 < l2) {
    long long w = (l1 + l2) / 2;
    if (pode(w))
      l2 = w;
    else
      l1 = w + 1;
  }
  cout << setprecision(10) << fixed << l1 / 2.0 << endl;
  return 0;
}
