#include <stdio.h>
#include <algorithm>
#include <fstream>
#include <set>
#include <utility>
using namespace std;
#define in "heavymetal.in"
#define out "heavymetal.out"
#define dim 100001
inline int Maxim(int a, int b) {
if ( a > b ) return a;
return b;
}
int N, maxim;
int Poz, Val, start, finish, middle;
int S[dim], F[dim], C[dim], A[dim];
int Arb[2*dim+66];
set< pair<int,int> > H;
set< pair<int,int> >::iterator it, it2;
void Update(int,int,int);
void Query(int,int,int);
int main()
{
int X, Y;
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d", &N);
for ( int i = 1; i <= N; i++ )
{
scanf("%d%d", &X, &Y);
H.insert( make_pair(X,Y) );
}
int k = 1;
for ( it = H.begin(); it != H.end(); it++, k++ )
C[k] = it->second - it->first, S[k] = it->first, F[k] = it->second;
memset(A,0,sizeof(A));
maxim = 0;
Val = C[1], Poz = 1, A[1] = C[1];
Update(1,1,N);
int T = A[1];
for ( int i = 2; i <= N; i++ )
{
int j, k;
for ( k = 1; k < i; k++ )
if ( F[k] <= S[i] ) break;
for ( j = i-1; j >= k; j-- )
if ( F[j] <= S[i] ) break;
if ( j == 0 || k > j )
{
A[i] = C[i];
Poz = i, Val = A[i];
Update(1,1,N);
if ( T < A[i] ) T = A[i];
}
else
{
maxim = 0, start = k, finish = j;
Query(1,1,N);
A[i] = C[i] + maxim;
Poz = i, Val = A[i];
Update(1,1,N);
}
if ( T < A[i] ) T = A[i];
}
printf("%d", T);
}
void Update(int nod, int left, int right)
{
if ( left == right )
{
Arb[nod] = Val;
return;
}
int middle = (left+right)>>1;
if ( Poz <= middle ) Update(2*nod,left,middle);
else Update(2*nod+1,middle+1,right);
Arb[nod] = Arb[2*nod+1];
if ( Arb[2*nod] > Arb[2*nod+1] ) Arb[nod] = Arb[2*nod];
}
void Query(int nod, int st, int dr)
{
if ( start <= st && dr <= finish )
{
if ( maxim < Arb[nod] ) maxim = Arb[nod];
return;
}
int mij = (st+dr)>>1;
if ( start <= mij ) Query(2*nod,st,mij);
if ( mij < finish ) Query(2*nod+1,mij+1,dr);
}