#include<stack>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 204800
char str;
int n;
struct edge
{
	int to;
	int nxt;
}nd[30*maxn];
int head[5*maxn],cnt;
int dfn[5*maxn],low[5*maxn],belong[5*maxn];
int dep,tot;
stack<int>s;
bool vis[5*maxn];
int vio;
int pos[maxn];
struct node
{
	int x,y;
	node(int xx=0,int yy=0)
	{
		x=xx;
		y=yy;
		return;
	}
	friend bool operator < (node a,node b)
	{
		return a.x<b.x;
	}
}sa[maxn];
template<class X> inline void read(X &x)
{
	x=0;
	X f=1;
	while(!isdigit(str))
	{
		if(str=='-')
		{
			f=-1;
		}
		str=getchar();
	}
	while(isdigit(str))
	{
		x*=10;
		x+=str-'0';
		str=getchar();
	}
	x*=f;
	return;
}
void init()
{
	memset(head,-1,sizeof(head));
	memset(dfn,0,sizeof(dfn));
	memset(low,0,sizeof(low));
	memset(belong,0,sizeof(belong));
	memset(vis,0,sizeof(vis));
	while(s.size())
	{
		s.pop();
	}
	cnt=dep=1;
	tot=0;
	return;
}
void add(int x,int y)
{
	nd[cnt].to=y;
	nd[cnt].nxt=head[x];
	head[x]=cnt++;
	return;
}
void tarjan(int x)
{
	dfn[x]=low[x]=dep++;
	s.push(x);
	vis[x]=1;
	for(int i=head[x];i!=-1;i=nd[i].nxt)
	{
		int t=nd[i].to;
		if(!dfn[t])
		{
			tarjan(t);
			low[x]=min(low[x],low[t]);
		}else if(vis[t])
		{
			low[x]=min(low[x],dfn[t]);
		}
	}
	if(dfn[x]==low[x])
	{
		tot++;
		int c=-1;
		while(c!=x)
		{
			c=s.top();
			s.pop();
			vis[c]=0;
			belong[c]=tot;
		}
	}
	return;
}
void build(int l,int r,int rt)
{
	if(l==r)
	{
		add(rt+vio,sa[l].y<n?sa[l].y+n:sa[l].y-n);
		return;
	}else
	{
		int mid=(l+r)>>1;
		build(l,mid,rt<<1);
		build(mid+1,r,rt<<1|1);
		add(rt+vio,(rt<<1)+vio);
		add(rt+vio,(rt<<1|1)+vio);
		return;
	}
}
void insert(int L,int R,int l,int r,int rt,int z)
{
	if(L<=l&&R>=r)
	{
		add(z,rt+vio);
		return;
	}else
	{
		int mid=(l+r)>>1;
		if(L<=mid)
		{
			insert(L,R,l,mid,rt<<1,z);
		}
		if(R>mid)
		{
			insert(L,R,mid+1,r,rt<<1|1,z);
		}
		return;
	}
}
bool check(int x)
{
	init();
	build(1,vio,1);
	int l=1,r=1;
	for(int i=1;i<=vio;i++)
	{
		int op,p=sa[i].y;
		if(p<=n)
		{
			op=pos[p+n];
		}else
		{
			op=pos[p-n];
		}
		while(r<=i&&sa[r].x+x<sa[i].x)
		{
			r++;
		}
		if(r<i&&r>=1&&sa[r].x+x>sa[i].x)
		{
			if(r<=op&&op<i)
			{
				if(r<op)
				{
					insert(r,op-1,1,vio,1,sa[i].y);
				}
				if(op<i-1)
				{
					insert(op+1,i-1,1,vio,1,sa[i].y);
				}
			}else
			{
				insert(r,i-1,1,vio,1,sa[i].y);
			}
		}
		while(l<=vio&&sa[l].x-x<sa[i].x)
		{
			l++;
		}
		l--;
		if(l<=vio&&l>i&&sa[l].x-x<sa[i].x)
		{
			if(i+1<=op&&op<=l)
			{
				if(i+1<op)
				{
					insert(i+1,op-1,1,vio,1,sa[i].y);
				}
				if(op<l)
				{
					insert(op+1,l,1,vio,1,sa[i].y);
				}
			}else
			{
				insert(i+1,l,1,vio,1,sa[i].y);
			}
		}
	}
	for(int i=1;i<=vio;i++)
	{
		if(!dfn[i])
		{
			tarjan(i);
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(belong[i]==belong[i+n])
		{
			return 0;
		}
	}
	return 1;
}
int main()
{
	read(n);
	int ans,mx=-0x3f3f3f3f,mi=0x3f3f3f3f;
	for(int i=1;i<=n;i++)
	{
		int u,v;
		read(u),read(v);
		mi=min(mi,min(u,v));
		mx=max(mx,max(u,v));
		sa[++vio]=node(u,i);
		sa[++vio]=node(v,i+n);
	}
	if(mx-mi+1<n)
	{
		printf("0\n");
		return 0;
	}
	sort(sa+1,sa+vio+1);
	for(int i=1;i<=vio;i++)
	{
		pos[sa[i].y]=i;
	}
	int l=0,r=mx;
	while(l<=r)
	{
		int mid=(l+r)>>1;
		if(check(mid))
		{
			ans=mid;
			l=mid+1;
		}else
		{
			r=mid-1;
		}
	}
	printf("%d\n",ans);
	return 0;
}


Measured memory_bytes: 31616