#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100005
struct up{int l,r;}a[N];
bool cmp(up A,up B){return A.l==B.l?A.r>B.r:A.l<B.l;}
int n,mx,mn,fl[N],fr[N],tt,glx[N],gln[N],grx[N],grn[N];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%d%d",&a[i].l,&a[i].r);
	sort(a+1,a+n+1,cmp);
	mx=1,mn=1e9;
	for(int i=1;i<n;++i){
		mx=max(mx,a[i].l);
		mn=min(mn,a[i].r);
		fl[i]=max(mn-mx+1,0);
	}
	mx=1,mn=1e9;
	for(int i=n;i>1;--i){
		mx=max(mx,a[i].l);
		mn=min(mn,a[i].r);
		fr[i]=max(mn-mx+1,0);
	}
	for(int i=1;i<n;++i) tt=max(tt,fl[i]+fr[i+1]);
	gln[0]=grn[n+1]=1e9;
	for(int i=1;i<=n;++i){
		gln[i]=min(gln[i-1],a[i].r);
		glx[i]=max(glx[i-1],a[i].l); 
	}
	for(int i=n;i>=1;--i){
		grn[i]=min(grn[i+1],a[i].r);
		grx[i]=max(grx[i+1],a[i].l);
	}
	for(int i=1;i<=n;++i){
		int p=max(min(gln[i-1],grn[i+1])-max(glx[i-1],grx[i+1])+1,0);
		tt=max(tt,a[i].r-a[i].l+1+p);
	}
	printf("%d",tt);
	return 0;
}