///====================== TEMPLATE STARTS HERE =====================///
#include <bits/stdc++.h>
using namespace std;

//#include <ext/pb_ds/assoc_container.hpp> // Include for built in treap
//#include <ext/pb_ds/tree_policy.hpp>
//using namespace __gnu_pbds;

//#include <sys/resource.h>     // for linux stack memory increase
//#define gc getchar_unlocked   // for linux fast io
//#define gc getchar            // for windows fast io

#define pb push_back
#define MP make_pair
#define ff first
#define ss second
#define nl puts("")
#define sp printf(" ")
#define phl debug("Hello")
#define FOR(i,x,y) for(vlong i = (x) ; i <= (y) ; ++i)
#define ROF(i,x,y) for(vlong i = (y) ; i >= (x) ; --i)
#define CLR(x,y) memset(x,y,sizeof(x))
#define ALL(x) (x).begin(),(x).end()
#define SZ(x) ((vlong)(x).size())
#define UNIQUE(V) (V).erase(unique((V).begin(),(V).end()),(V).end())
#define MIN(a,b) ((a)<(b)?(a):(b))
#define MAX(a,b) ((a)>(b)?(a):(b))
#define ABS(x) ((x)<0?-(x):(x))
#define FABS(x) ((x)+eps<0?-(x):(x))
#define SQ(x) ((x)*(x))
#define LCM(x,y) (((x)/gcd((x),(y)))*(y))
#define POPCOUNT __builtin_popcountll
#define RIGHTMOST __builtin_ctzll
#define LEFTMOST(x) (63-__builtin_clzll((x)))
#define NUMDIGIT(x,y) (((vlong)(log10((x))/log10((y))))+1)
#define NORM(x) if(x>=mod) x-=mod;if(x<0) x+=mod;
#define ODD(x) (((x)&1)==0?(0):(1))
#define Set(N,p) N=((N)|((1LL)<<(p)))
#define Reset(N,p) N=((N)&(~((1LL)<<(p))))
#define Check(N,p) (!(((N)&((1LL)<<(p)))==(0)))
#define fast_cin ios_base::sync_with_stdio(false);cin.tie(NULL)
#define arrayIndexPrint(A,i) cerr<<"~ At pos: "<<i<<" = "<<A[i]
#define dump(x) cerr<<"~ "<<#x<<" = "<<x<<endl
#define arrayPrint(A,st,ed) cerr<<"~ Array:";FOR(i,st,ed) cerr<<" "<<A[i];cerr<<endl
#define LINE cerr<<"\n"; FOR(i,0,50) cerr<<"=";cerr<<"\n\n"

#define LL long long
#define LLU long long unsigned int
typedef long long vlong;
typedef unsigned long long uvlong;
typedef pair < int, int > pii;
typedef pair < vlong, vlong > pll;
typedef vector<int> vi;
typedef vector<vlong> vl;
typedef vector<pll> vll;
//typedef tree <int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pb_ds;

#ifdef forthright48
     #include <ctime>
     clock_t tStart = clock();
     #define debug(args...) {dbg,args; cerr<<endl;}
     #define timeStamp debug ("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)
     #define bug printf("%d\n",__LINE__);

#else
    #define debug(args...)  // Just strip off all debug tokens
    #define timeStamp
#endif

struct debugger{
    template<typename T> debugger& operator , (const T& v){
        cerr<<v<<" ";
        return *this;
    }
}dbg;

inline vlong gcd ( vlong a, vlong b ) {
    a = ABS ( a ); b = ABS ( b );
    while ( b ) { a = a % b; swap ( a, b ); } return a;
}

vlong ext_gcd ( vlong A, vlong B, vlong *X, vlong *Y ){
    vlong x2, y2, x1, y1, x, y, r2, r1, q, r;
    x2 = 1; y2 = 0;
    x1 = 0; y1 = 1;
    for (r2 = A, r1 = B; r1 != 0; r2 = r1, r1 = r, x2 = x1, y2 = y1, x1 = x, y1 = y ) {
        q = r2 / r1;
        r = r2 % r1;
        x = x2 - (q * x1);
        y = y2 - (q * y1);
    }
    *X = x2; *Y = y2;
    return r2;
}

inline vlong modInv ( vlong a, vlong m ) {
    vlong x, y;
    ext_gcd( a, m, &x, &y );
    x %= m;
    if ( x < 0 ) x += m;
    return x;
}

inline vlong bigmod ( vlong a, vlong p, vlong m ) {
    vlong res = 1 % m, x = a % m;
    while ( p ) {
        if ( p & 1 ) res = ( res * x ) % m;
        x = ( x * x ) % m; p >>= 1; /// For bigmod2 multiply here using mulmod
    }
    return res;
}


//int knightDir[8][2] = { {-2,1},{-1,2},{1,2},{2,1},{2,-1},{-1,-2},{1,-2},{-2,-1} };
//int dir4[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
//int dir8[8][2] = {{-1,0},{0,1},{1,0},{0,-1},{-1,-1},{1,1},{1,-1},{-1,1}};
const vlong inf = 2147383647;
const vlong mod = 1000000007;
const double pi = 2 * acos ( 0.0 );
const double eps = 1e-11;
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); /// For generating random numbers

///======================  TEMPLATE ENDS HERE  =====================///

#define SIZE 100005

int n;
vector<pii> V;

bool comp(const pii &a, const pii &b) {
    if(a.first<b.first) return true;
    else if(a.first>b.first) return false;
    else if(a.second>b.second) return true;
    else if(a.second<b.second) return false;
    else return false;
}

int mark[SIZE];

multiset<int> m1y, m2x;

int main () {
    #ifdef forthright48
    freopen ( "input.txt", "r", stdin );
    //freopen ( "output.txt", "w", stdout );
    #endif // forthright48

    fast_cin;

    cin >> n;

    int mxL = -1, mnR = inf;
    for(int i=0; i<n; i++) {
        int l, r;
        cin >> l >> r;
        V.push_back(pii(l, r));
        mxL = max(mxL, l);
        mnR = min(mnR, r);
    }

    if(n==2) {
        cout << (V[0].second-V[0].first+1) + (V[1].second-V[1].first+1) << "\n";
        return 0;
    }

    sort(V.begin(), V.end(), comp);

    pii p = pii(-1, -1), q = pii(-1, -1);

    for(int i=n-1; i>=0; i--) {
        if(V[i].first==mxL) {
            mark[i] = 1;
            p = V[i];
            break;
        }
    }

    for(int i=0; i<n; i++) {
        if(!mark[i] && V[i].second==mnR) {
            mark[i] = 1;
            q = V[i];
            break;
        }
    }

    if(q.first==-1) {
        int ret = max(mnR-mxL+1, 0);
        int mx = 0;
        for(int i=0; i<n; i++) {
            if(!mark[i]) {
                mx = max(mx, V[i].second-V[i].first+1);
            }
        }
        ret += mx;
        cout << ret << "\n";
        return 0;
    }

    int ret = max(q.second-p.first+1, 0);
    int mx = 0;
    for(int i=0; i<n; i++) {
        if(!mark[i]) {
            mx = max(mx, V[i].second-V[i].first+1);
        }
    }
    ret += mx;

    for(int i=0; i<n; i++) {
        if(!mark[i]) {
            m1y.insert(V[i].second);
        }
    }

    int ret2 = 0;
    set<int>::iterator it;
    int m1mxL, m1mnR, m2mxL, m2mnR, m1diff, m2diff;

    int init = 0;
    for(int i=0; i<n; i++) {
        if(!mark[i]) {
            if(!init) {
                m1mxL = p.first;
                it = m1y.begin();
                m1mnR = *it;
                m1diff = max(m1mnR-m1mxL+1, 0);

                m2mxL = q.first;
                m2mnR = q.second;
                m2diff = max(m2mnR-m2mxL+1, 0);

                ret2 = max(ret2, m1diff+m2diff);

                init = 1;
            }
            else {
                m1mxL = p.first;
                it = m1y.begin();
                m1mnR = *it;
                m1diff = max(m1mnR-m1mxL+1, 0);

                it = m2x.end();
                it--;
                m2mxL = *it;
                m2mnR = q.second;
                m2diff = max(m2mnR-m2mxL+1, 0);

                ret2 = max(ret2, m1diff+m2diff);
            }
            m1y.erase(m1y.find(V[i].second));
            m2x.insert(V[i].first);
        }
    }

    m1mxL = p.first;
    m1mnR = p.second;
    m1diff = max(m1mnR-m1mxL+1, 0);

    it = m2x.end();
    it--;
    m2mxL = *it;
    m2diff = max(m2mnR-m2mxL+1, 0);

    ret2 = max(ret2, m1diff+m2diff);

    ret = max(ret, ret2);

    cout << ret << "\n";

    return 0;
}


Measured memory_bytes: 5748