/* ARC 069F 线段树优化2sat
 * 给定 n 个旗子，每个旗子可以放在 ai 或者 bi 位置，询问最优方法下最近的两个旗子的最远距离是多少。
 */

#include <bits/stdc++.h>

using namespace std;

#define pb push_back
typedef long long ll;
typedef pair<int,int> pii;

const int mn=2e5+5;

int n;
int a[mn],b[mn];

vector<pii> v;//pair< 数值 , 另一半的位置 >

namespace twosat_Tarjan {
    int n2;
    vector<int> g[mn];
    int pre[mn], lowlink[mn], sccno[mn], dfs_clock, scc_cnt;
    stack<int> s;

    void dfs(int u) {
        pre[u] = lowlink[u] = ++dfs_clock;
        s.push(u);
        for (int i = 0; i < g[u].size(); i++) {
            int v = g[u][i];
            if (!pre[v]) {
                dfs(v);
                lowlink[u] = min(lowlink[u], lowlink[v]);
            } else if (!sccno[v]) {
                lowlink[u] = min(lowlink[u], pre[v]);
            }
        }
        if (lowlink[u] == pre[u]) {
            scc_cnt++;
            while (1) {
                int x = s.top();
                s.pop();
                sccno[x] = scc_cnt;
                if (x == u) break;
            }
        }
    }

    void add_edge(int x, int xval, int y, int yval) {
        g[x << 1 | xval].pb(y << 1 | yval);
    }

    void add_edge(int x,int y){ //x->y 表示 x 能推导出 y
        g[x].pb(y);
    }

#define mem(a) memset(a,0,sizeof(a))

    void find_scc() {
        dfs_clock = scc_cnt = 0;
        mem(sccno);
        mem(pre);
        for (int i = 1; i <= n2; i++) if (!pre[i]) dfs(i);
    }

    bool solvable() {//是否有解
        find_scc();
        for (int i = 1; i < v.size(); i++) {
            if (sccno[i] == sccno[v[i].second]) {
                return 0;
            }
        }
        return 1;
    }
}
using namespace twosat_Tarjan;

namespace segment_tree{
    int n1;

    void build(int k,int l,int r){
        if (l==r-1){
            add_edge(n1+k,v[(k<<1)-n1+1].second);
            add_edge(n1+k,v[(k<<1|1)-n1+1].second);
            return;
        }
        int mid=l+r>>1;
        add_edge(n1+k,n1+(k<<1));
        add_edge(n1+k,n1+(k<<1|1));
        build(k<<1,l,mid);
        build(k<<1|1,mid+1,r);
    }

    void tinit(){
        n2=n*2;
        n1=1;
        while(n1<n2) n1<<=1;
        build(1,1,n1);
    }

    vector<int> temp;
    void reinit(){
        for(auto &i:temp){
            g[i].pop_back();
        }
        temp.clear();
    }

    int ql,qr,qs;
    void paint(int k,int l,int r){ // 染色，考虑把区间染成不可取
        if (ql>r||qr<l) return;
        if (ql<=l&&r<=qr) {
            if (l==r) add_edge(qs,v[k-n1+1].second);
            else add_edge(qs,n1+k);
            temp.pb(qs);
        }
        else{
            int mid=r+l>>1;
            paint(k<<1,l,mid);
            paint(k<<1|1,mid+1,r);
        }
    }
}
using namespace segment_tree;

bool c(int x){
    reinit();
    for(int j=1;j<v.size();j++){
        pii &i=v[j];
        int l=lower_bound(v.begin(),v.end(),pii(i.first-x+1,-1))-v.begin();
        int r=lower_bound(v.begin(),v.end(),pii(i.first+x,-1))-v.begin()-1;
        l=max(l,1);
        if (l<j){// 注意不要一不小心把自己给染了，后果严重
            ql=l,qr=j-1,qs=j;
            paint(1,1,n1);
        }
        if (r>j){
            ql=j+1,qr=r,qs=j;
            paint(1,1,n1);
        }
    }
    return solvable();
}


int main() {
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]),v.pb(pii(a[i],i)),v.pb(pii(b[i],-i));
    v.pb(pii(0,0));
    sort(v.begin(),v.end());
    for(int j=1;j<v.size();j++){
        if (v[j].second<0){
            b[-v[j].second]=j;
        }
        else a[v[j].second]=j;
    }
    for(int j=1;j<v.size();j++){
        if (v[j].second<0) v[j].second=a[-v[j].second];
        else v[j].second=b[v[j].second];
    }
    tinit();
    int l=0,r=1050000000/(n-1),ans=0;
    while(l<=r){
        int mid=l+r>>1;
        if (c(mid)) l=mid+1,ans=mid;
        else r=mid-1;
    }
    printf("%d\n",ans);
    return 0;
}

Measured memory_bytes: 18924