#include<bits/stdc++.h>
using namespace std;
int n, m;
vector<int> G[200005], SCC[200005];
int ig[200005], dfn[200005], low[200005], col[200005], vl[200005];
int a1, a2, cnt, ign, ans, ccnt, tot, id[200005];
bool vis[200005], vvis[200005];
stack<int> s;
queue<int> q;
struct node{
int id, vl;
}a[200005];
int pirano(int u){
if (u <= n)
return u + n;
else
return u - n;
}
void build(int u, int l, int r){
id[u] = ++tot;
if (l == r){
G[id[u]].push_back(pirano(a[l].id));
return;
}
int mid = (l + r) >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
G[id[u]].push_back(id[u << 1]);
G[id[u]].push_back(id[u << 1 | 1]);
}
void RangeLink(int u, int l, int r, int L, int R, int pos){
if (L > R)
return;
if (l > R || r < L)
return;
if (L <= l && r <= R){
G[pos].push_back(id[u]);
return;
}
int mid = (l + r) >> 1;
RangeLink(u << 1, l, mid, L, R, pos);
RangeLink(u << 1 | 1, mid + 1, r, L, R, pos);
}
void tarjan(int u){
dfn[u] = low[u] = ++cnt;
s.push(u);
vis[u] = 1;
for (auto &v : G[u]){
if (!dfn[v]){
tarjan(v);
low[u] = min(low[u], low[v]);
}else if (vis[v])
low[u] = min(low[u], dfn[v]);
}
if (dfn[u] == low[u]){
ccnt++;
while (!s.empty()){
int v = s.top();
s.pop();
vis[v] = 0;
col[v] = ccnt;
SCC[u].push_back(v);
if (u == v)
break;
}
}
}
int fnd(int x){
int l = 1, r = (n << 1), ans = -1;
while (l <= r){
int mid = (l + r) >> 1;
if (a[mid].vl > x)
ans = mid, r = mid - 1;
else
l = mid + 1;
}
return ans;
}
bool check(int mid){
memset(dfn, 0, sizeof dfn);
memset(low, 0, sizeof low);
memset(col, 0, sizeof col);
cnt = 0;
ccnt = 0;
for (int i = 1; i <= (n << 1); i++)
G[i].clear();
tot = (n << 1);
build(1, 1, n << 1);
for (int i = 1; i <= 2 * n; i++){
int ll = fnd(a[i].vl - mid), rr = fnd(a[i].vl + mid - 1) - 1;
RangeLink(1, 1, n << 1, ll, i - 1, a[i].id);
RangeLink(1, 1, n << 1, i + 1, rr, a[i].id);
}
for (int i = 1; i <= 2 * n; i++)
if (!dfn[i])
tarjan(i);
for (int i = 1; i <= n; i++)
if (col[i] == col[i + n])
return 0;
return 1;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
while (cin >> n){
for (int i = 1; i <= n; i++)
cin >> a[i].vl >> a[i + n].vl;
for (int i = 1; i <= (n << 1); i++)
a[i].id = i;
sort(a + 1, a + 1 + (n << 1), [](node u, node v){return u.vl < v.vl;});
int l = 0, r = a[n << 1].vl - a[1].vl, ans = 0;
while (l <= r){
int mid = (l + r) >> 1;
if (check(mid))
ans = mid, l = mid + 1;
else
r = mid - 1;
}
cout << ans << "\n";
}
return 0;
}
为什么啊/kel