#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n;
struct point {
  int x, y;
} p[N];
int mins_l[N], maxs_l[N], mins_r[N], maxs_r[N];
bool check(int x) {
  int r = 0;
  for (int i = 1; i <= n; ++i) {
    while (r + 1 <= n && p[r + 1].x - p[i].x <= x) ++r;
    if (i == 1) {
      if ((r == n ? 0 : maxs_r[r + 1]) - (r == n ? 0 : mins_r[r + 1]) <= x)
        return 1;
    } else if (max(maxs_l[i - 1], r == n ? maxs_l[i - 1] : maxs_r[r + 1]) -
                   min(mins_l[i - 1], r == n ? mins_l[i - 1] : mins_r[r + 1]) <=
               x)
      return 1;
  }
  return 0;
}
bool pd(point i, point j) { return i.x < j.x; }
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    scanf("%d%d", &p[i].x, &p[i].y);
    p[i].x = p[i].x + p[i].y;
    p[i].y = p[i].x - 2 * p[i].y;
  }
  sort(p + 1, p + 1 + n, pd);
  mins_l[1] = maxs_l[1] = p[1].y;
  for (int i = 2; i <= n; ++i)
    mins_l[i] = min(mins_l[i - 1], p[i].y),
    maxs_l[i] = max(maxs_l[i - 1], p[i].y);
  mins_r[n] = maxs_r[n] = p[n].y;
  for (int i = n - 1; i; --i)
    mins_r[i] = min(mins_r[i + 1], p[i].y),
    maxs_r[i] = max(maxs_r[i + 1], p[i].y);
  int l = 0, r = 2e9, ans = 0, tot = 0;
  while (l <= r) {
    ++tot;
    int mid = ((long long)l + r) / 2;
    if (check(mid))
      ans = mid, r = mid - 1;
    else
      l = mid + 1;
  }
  printf("%lf\n", (double)ans / 2);
}
