#include <bits/stdc++.h>
using namespace std;
const int oo = 2000000001;
const int MAX_N = 100005;
pair<int, int> Points[MAX_N];
int N, MinY[2][MAX_N], MaxY[2][MAX_N];
double Solution;
bool FindLines(const int maxDistance) {
  for (int left = 1, right = 1; right <= N; ++right) {
    for (; maxDistance < Points[right].first - Points[left].first; ++left)
      ;
    int minY = min(MinY[0][left - 1], MinY[1][right + 1]);
    int maxY = max(MaxY[0][left - 1], MaxY[1][right + 1]);
    if (maxY - minY <= maxDistance) return true;
  }
  return false;
}
void Preprocess() {
  sort(Points + 1, Points + N + 1);
  MinY[0][0] = oo;
  MaxY[0][0] = -oo;
  for (int i = 1; i <= N; ++i) {
    MinY[0][i] = min(MinY[0][i - 1], Points[i].second);
    MaxY[0][i] = max(MaxY[0][i - 1], Points[i].second);
  }
  MinY[1][N + 1] = oo;
  MaxY[1][N + 1] = -oo;
  for (int i = N; i > 0; --i) {
    MinY[1][i] = min(MinY[1][i + 1], Points[i].second);
    MaxY[1][i] = max(MaxY[1][i + 1], Points[i].second);
  }
}
void Solve() {
  Preprocess();
  int left = 0, right = oo;
  while (left <= right) {
    int middle = (left + right) / 2;
    if (FindLines(2 * middle)) {
      right = middle - 1;
      Solution = middle;
    } else {
      left = middle + 1;
    }
  }
  if (Solution > 0.5 && FindLines(2 * Solution - 1)) Solution -= 0.5;
}
void Read() {
  cin >> N;
  for (int i = 1; i <= N; ++i) {
    cin >> Points[i].first >> Points[i].second;
    Points[i] = pair<int, int>(Points[i].first + Points[i].second,
                               Points[i].first - Points[i].second);
  }
}
void Print() { cout << fixed << setprecision(8) << Solution << "\n"; }
int main() {
  Read();
  Solve();
  Print();
  return 0;
}
