
#include <stdio.h>
typedef struct TimeSegment {
int start;
int end;
} ts;
int cmp(const void* a,const void * b) {
ts* t1=(ts*)a;
ts* t2=(ts*)b;
if(t1->start != t2->start) return t1->start - t2->start;
else return t2->end - t1->end;
}
void swap(int* a,int* b) {
int t=*a;
*a=*b;
*b=t;
return;
}
int main(int argc, char* argv[]) {
int n;
int i;
int j;
ts a[5001];
while(scanf("%d",&n)!=EOF) {
for(i=0;i<n;i++){
scanf("%d%d",&a[i].start,&a[i].end);
if(a[i].start > a[i].end) swap(&a[i].start,&a[i].end);
}
qsort(a,n,sizeof(ts),cmp);
for(i=1;i<n;i++) {
if(a[i].start>=a[i-1].start && a[i].end <= a[i-1].end) {
for(j=i+1;j<n;j++) a[j-1]=a[j];
n=n-1;
i=i-1;
}
}
int max1=0;
int max2=0;
int start=a[0].start;
i=0;
while(i<n) {
while(i+1<n && a[i].end >= a[i+1].start) i++;
int t1;
int t2;
if(i+1<n) {
t1=a[i].end - start;
if(t1>max1) max1=t1;
t2 = a[i+1].start - a[i].end;
if(t2>max2) max2=t2;
start = a[i+1].start;
}
else if(start==a[n-1].start){
t1=a[n-1].end-a[n-1].start;
if(t1>max1) max1=t1;
}
else {
t1=a[n-1].end -start;
if(t1>max1) max1=t1;
}
i=i+1;
}
printf("%d %d\n",max1,max2);
}
return 0;
}