#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define DEBUG 0
#define MAX(x,y) (((x) > (y))?(x):(y))
struct cow
{
int start;
int end;
};
int compare(const void *,const void *);
int main()
{
#if(DEBUG == 0)
FILE * input = fopen("milk2.in","r");
FILE * output = fopen("milk2.out","w");
assert(input != NULL && output != NULL);
#endif
int N,i,maxl = 0,maxi = 0,ns = 0,amount;
#if(DEBUG == 0)
fscanf(input,"%d",&N);
#elif(DEBUG == 1)
scanf("%d",&N);
#endif
struct cow * farmer = (struct cow *)malloc(sizeof(struct cow) * (N + 1));
for(i = 1;i <= N;++i)
{
#if(DEBUG == 0)
fscanf(input,"%d%d",&farmer[i].start,&farmer[i].end);
#else
scanf("%d%d",&farmer[i].start,&farmer[i].end);
#endif
}
farmer[0].start = 0;
qsort(farmer,N+1,sizeof(struct cow),compare);
farmer[0].end = farmer[1].start;
#if(DEBUG == 1)
for(i = 0;i<=N;++i)
printf("farmer[%d]:%d %d\n",i,farmer[i].start,farmer[i].end);
#endif
for(i = 1;i <= N;++i)
{
//printf("farmer[%d].start:%d farmer[%d].end:%d\n",i,farmer[i].start,i-1,farmer[i-1].end);
if((farmer[i].start <= farmer[i-1].end))
{
if((amount = farmer[i].end - farmer[i-1].end) > 0)
{
ns += amount;
}
else farmer[i].end = farmer[i-1].end;
}
else
{
maxi = MAX(maxi,(farmer[i].start - farmer[i-1].end));
maxl = MAX(ns,maxl);
#if(DEBUG == 1)
printf("i:%d ns:%d maxi:%d\n",i,ns,maxi);
#endif
ns = farmer[i].end - farmer[i].start;
}
}
maxl = MAX(ns,maxl);
#if(DEBUG == 0)
fprintf(output,"%d %d\n",maxl,maxi);
#else
printf("%d %d\n",maxl,maxi);
#endif
exit(0);
}
int compare(const void * a,const void * b)
{
int c = ((const struct cow *)a)->start;
int d = ((const struct cow *)b)->start;
if(c > d)return 1;
else if(c == d)return 0;
else return -1;
}