#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,l,r,tot,x[N];
struct Line{
int l,r;
}line[N*2];
struct Node{
int l,r,cnt,len;
}t[N*4];
void build(int rt,int l,int r)
{
t[rt].l=l,t[rt].r=r;
if(l==r)return;
int mid=(l+r)>>1;
build(rt*2,l,mid);
build(rt*2,mid+1,r);
}
inline void pushup(int rt)
{
if(t[rt].cnt)t[rt].len=x[t[rt].r+1]-x[t[rt].l];
else if(t[rt].l==t[rt].r)t[rt].len=0;
else t[rt].len=t[rt*2].len+t[rt*2+1].len;
}
void modify(int rt,int l,int r,int v)
{
if(t[rt].l>=l&&t[rt].r<=r)
{
t[rt].cnt+=v;
pushup(rt);
return;
}
int mid=(l+r)>>1;
if(l<=mid)modify(rt*2,l,r,v);
if(r>mid)modify(rt*2+1,l,r,v);
pushup(rt);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d %d",&l,&r);
x[++tot]=l;
line[tot].l=l,line[tot].r=r;
x[++tot]=r;
line[tot].l=l,line[tot].r=r;
}
n=tot;
sort(x+1,x+n+1);
tot=unique(x+1,x+n+1)-x-1;
build(1,1,tot-1);
for(int i=1;i<=n;i++)
{
int l=lower_bound(x+1,x+tot+1,line[i].l)-x;
line[i].l=l;
int r=lower_bound(x+1,x+tot+1,line[i].r)-x;
cout<<l<<' '<<r<<endl;
line[i].r=r;
modify(1,l,r-1,1);
cout<<"-----"<<endl;
}
int ans=-114514;
for(int i=1;i<=n;i++)
{
int l=line[i].l,r=line[i].r;
modify(1,l,r-1,-1);
ans=max(ans,t[1].len);
modify(1,l,r-1,1);
}
printf("%d\n",ans);
return 0;
}