#include <bits/stdc++.h>
using namespace std;
const int N = 100000;
vector<pair<long long, long long> > pts;
const long long INF = (int)1e9;
long long MinLeft[N], MaxLeft[N], MinRight[N], MaxRight[N];
int n;
bool Check(long long val) {
  int right = 0;
  for (int i = 0; i < n; i++) {
    while (right < n && pts[right].first - pts[i].first <= val) right++;
    if (i == 0 && right == n)
      return true;
    else if (i == 0) {
      if (MaxRight[right] - MinRight[right] <= val) return true;
    } else if (right == n) {
      if (MaxLeft[i - 1] - MinLeft[i - 1] <= val) return true;
    } else {
      long long M = max(MaxRight[right], MaxLeft[i - 1]),
                m = min(MinLeft[i - 1], MinRight[right]);
      if (M - m <= val) return true;
    }
  }
  return false;
}
long long Search(long long low, long long high) {
  while (low <= high) {
    long long mid = (low + high) / 2;
    if (mid == 0 && Check(mid))
      return mid;
    else if (Check(mid) && !Check(mid - 1))
      return mid;
    else if (Check(mid))
      high = mid - 1;
    else
      low = mid + 1;
  }
}
int main() {
  long long x, y;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> x >> y;
    pts.push_back(make_pair(x + y, x - y));
  }
  sort(pts.begin(), pts.end());
  MinLeft[0] = pts[0].second;
  MaxLeft[0] = pts[0].second;
  for (int i = 1; i < n; i++) {
    MinLeft[i] = min(MinLeft[i - 1], pts[i].second);
    MaxLeft[i] = max(MaxLeft[i - 1], pts[i].second);
  }
  MinRight[n - 1] = pts[n - 1].second;
  MaxRight[n - 1] = pts[n - 1].second;
  for (int i = n - 2; i >= 0; i--) {
    MinRight[i] = min(MinRight[i + 1], pts[i].second);
    MaxRight[i] = max(MaxRight[i + 1], pts[i].second);
  }
  long long ret = Search(0, 4 * INF);
  printf("%.9lf\n", 0.5 * ret);
  return 0;
}
