#include<bits/stdc++.h>  
    using namespace std;  
    const int maxn=4e5;  
    struct node  
    {  
        int x,i;  
        bool operator < (const node &o) const  
        {  
            return x<o.x;  
        }  
    }nd[maxn];  
    int n,mp[maxn];  
    int sz,lc[maxn],rc[maxn];  
    vector<int> G[maxn];  
    void init()  
    {  
        for (int i=0;i<maxn;i++) G[i].clear();  
        sz=2*n;  
    }  
    void add(int u,int v)  
    {  
        G[u].push_back(v);  
    }  
    void build(int l,int r)  
    {  
        int o=sz++;  
        if (l==r)  
        {  
            lc[o]=rc[o]=0;add(o,mp[nd[l].i^1]);  
            return ;  
        }  
        int mid=(l+r)/2;  
        lc[o]=sz;build(l,mid);  
        rc[o]=sz;build(mid+1,r);  
        add(o,lc[o]);add(o,rc[o]);  
    }  
    int get1(int x)  
    {  
        int l=0,r=2*n-1,mid,ret;  
        while (l<=r)  
        {  
            mid=(l+r)/2;  
            if (nd[mid].x>=x)  
            {  
                ret=mid;  
                r=mid-1;  
            }  
            else l=mid+1;  
        }  
        return ret;  
    }  
    int get2(int x)  
    {  
        int l=0,r=2*n-1,mid,ret;  
        while (l<=r)  
        {  
            mid=(l+r)/2;  
            if (nd[mid].x<=x)  
            {  
                ret=mid;  
                l=mid+1;  
            }  
            else r=mid-1;  
        }  
        return ret;  
    }  
    void work(int o,int l,int r,int ql,int qr,int p)  
    {  
        if (ql<=l&&r<=qr)  
        {  
            add(p,o);return ;  
        }  
        int mid=(l+r)/2;  
        if (ql<=mid) work(lc[o],l,mid,ql,qr,p);  
        if (qr>mid) work(rc[o],mid+1,r,ql,qr,p);  
    }  
    int dfs_clock,scc_cnt,sccno[maxn],pre[maxn],low[maxn];  
    stack<int> S;  
    void dfs(int u)  
    {  
        pre[u]=low[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);low[u]=min(low[u],low[v]);  
            }  
            else if (!sccno[v]) low[u]=min(low[u],pre[v]);  
        }  
        if (low[u]==pre[u])  
        {  
            scc_cnt++;  
            for (;;)  
            {  
                int x=S.top();S.pop();  
                sccno[x]=scc_cnt;  
                if (x==u) break;  
            }  
        }  
    }  
    void tarjan(int n)  
    {  
        dfs_clock=scc_cnt=0;  
        memset(sccno,0,sizeof(sccno));  
        memset(pre,0,sizeof(pre));  
        for (int i=0;i<n;i++) if (!pre[i]) dfs(i);  
    }  
    bool check(int mid)  
    {  
        init();  
        build(0,2*n-1);  
        for (int i=0;i<2*n;i++)  
        {  
            int i1=get1(nd[i].x-mid+1),i2=get2(nd[i].x+mid-1);  
            if (i1<i) work(2*n,0,2*n-1,i1,i-1,i);  
            if (i<i2) work(2*n,0,2*n-1,i+1,i2,i);  
        }  
        tarjan(sz);  
        for (int i=0;i<2*n;i++) if (sccno[i]==sccno[mp[nd[i].i^1]]) return 0;  
        return 1;  
    }  
    int main()  
    {  
        cin>>n;  
        for (int i=0;i<2*n;i++) scanf("%d",&nd[i].x),nd[i].i=i;  
        sort(nd,nd+2*n);  
        for (int i=0;i<2*n;i++) mp[nd[i].i]=i;  
        int l=1,r=1e9,mid,ans=0;  
        while (l<=r)  
        {  
            mid=(l+r)/2;  
            if (check(mid))  
            {  
                ans=mid;  
                l=mid+1;  
            }  
            else r=mid-1;  
        }  
        cout<<ans;  
        return 0;  
    }  

Measured memory_bytes: 28560