#include <bits/stdc++.h>
#define xx first
#define yy second
#define mp make_pair
#define pb push_back
#define mset(x, y) memset(x, y, sizeof x)
#define mcpy(x, y) memcpy(x, y, sizeof x)
using namespace std;
typedef long long LL;
typedef pair <int, int> pii;
inline int Read()
{
int x = 0, f = 1, c = getchar();
for (; !isdigit(c); c = getchar())
if (c == '-')
f = -1;
for (; isdigit(c); c = getchar())
x = x * 10 + c - '0';
return x * f;
}
const int MAXN = 200005;
struct SAT
{
int n, cnt, tim, top, sta[MAXN], dfn[MAXN], low[MAXN], scc[MAXN];
vector <int> adj[MAXN];
inline void Init(int m)
{
n = m, tim = cnt = 0;
for (int i = 1; i <= n << 1; i ++)
dfn[i] = scc[i] = 0, adj[i].clear();
}
inline void Addedge(int x, int y)
{
adj[x].pb(y), adj[y > n ? y - n : y + n].pb(x > n ? x - n : x + n);
}
inline void Dfs(int x)
{
int k = 0;
dfn[sta[++ top] = x] = low[x] = ++ tim;
for (auto y : adj[x])
if (!dfn[y])
Dfs(y), low[x] = min(low[x], low[y]);
else if (!scc[y])
low[x] = min(low[x], dfn[y]);
if (dfn[x] == low[x])
for (cnt ++; k ^ x; scc[k = sta[top --]] = cnt);
}
inline bool Solve()
{
for (int i = 1; i <= n << 1; i ++)
if (!dfn[i])
Dfs(i);
for (int i = 1; i <= n; i ++)
if (scc[i] == scc[i + n])
return false;
return true;
}
} sat;
int n, m, x[MAXN], p[MAXN], idx[MAXN];
inline void Build(int x, int l, int r)
{
idx[x] = ++ m;
if (l == r)
return ;
int mid = l + r >> 1;
Build(x << 1, l, mid), Build(x << 1 | 1, mid + 1, r);
}
inline void Addedge(int x, int l, int r)
{
if (l == r)
return sat.Addedge(idx[x], p[l] + m);
int mid = l + r >> 1;
Addedge(x << 1, l, mid), Addedge(x << 1 | 1, mid + 1, r);
sat.Addedge(idx[x], idx[x << 1]), sat.Addedge(idx[x], idx[x << 1 | 1]);
}
inline void Addedge(int x, int l, int r, int ql, int qr, int p)
{
if (l == ql && r == qr)
return sat.Addedge(p, idx[x]);
int mid = l + r >> 1;
if (qr <= mid)
return Addedge(x << 1, l, mid, ql, qr, p);
if (ql > mid)
return Addedge(x << 1 | 1, mid + 1, r, ql, qr, p);
return Addedge(x << 1, l, mid, ql, mid, p), Addedge(x << 1 | 1, mid + 1, r, mid + 1, qr, p);
}
inline bool Chk(int lim)
{
sat.Init(m);
Addedge(1, 1, n << 1);
for (int i = 1; i <= n << 1; i += 2)
sat.Addedge(i, i + 1 + m), sat.Addedge(i + m + 1, i);
for (int i = 1, j = 1; i <= n << 1; i ++)
{
for (; j <= n << 1 && x[p[j]] - x[p[i]] < lim; j ++);
if (i + 1 < j)
Addedge(1, 1, n << 1, i + 1, j - 1, p[i]);
}
return sat.Solve();
}
int main()
{
#ifdef wxh010910
freopen("data.in", "r", stdin);
#endif
n = Read();
for (int i = 1; i <= n << 1; i ++)
x[++ m] = Read(), p[m] = m;
sort(p + 1, p + m + 1, [&](int a, int b) { return x[a] < x[b]; });
Build(1, 1, m);
int l = 1, r = 1e9, ret = 0;
while (l <= r)
{
int mid = l + r >> 1;
if (Chk(mid))
ret = mid, l = mid + 1;
else
r = mid - 1;
}
return printf("%d\n", ret), 0;
}