/*************************************************************************
 *                                                                       *
 *                       Pogromcy Algorytmów 2004                        *
 *                                                                       *
 *   Rozwiązanie zadania: Zbrodnia na Piccadilly Circus                  *
 *   Plik:                pic.cpp                                        *
 *   Autor:               Michał Adamaszek                               *
 *************************************************************************/

/* Rozwiazanie zadania Picadilly
   Michal Adamaszek, 2003.09.28
   
   Szkic rozw:

   Normujemy przedzialy aby miescily sie w [p;k]. Wyznaczamy minimalna
   i maksymalna liczbe przedzialow wchodzacych w ich sume na osi rzeczywistej.
   Sortujemy konce przedzialow. Zamiatamy i wyznaczamy min i max.
   
   Zlozonosc:
   
   O(nlogn) (sortowanie)
   
   Pamiec:
   
   O(n)
   
*/

#include <stdio.h>
#include <stdlib.h>

#define max(a,b) ((a) > (b) ? (a) : (b))
#define min(a,b) ((a) < (b) ? (a) : (b))

const int MAX_N = 5000;	

/* Poczatek / koniec przedzialu  */
typedef enum TBE { BG, EN };

/* Punkt w czasie */
typedef struct TTimePt {
    int t;	/* Czas */
    TBE be;	/* Poczatek czy koniec przedz. */
};

/* Zmienne programu */
int n;
int n_real;		/* Liczba faktycznie istotnych przedzialow */
int bg, en;		/* Poczatek i koniec sledzenia */
TTimePt pt[2 * MAX_N + 1];	/* Pocz, konce przedzialow */

/* Funkcja sortujaca */
int timept_sort(const void *a, const void *b) {
    TTimePt *pt1 = (TTimePt*)a, *pt2 = (TTimePt*)b;
    
    if (pt1->t < pt2->t) return -1;
    if (pt1->t > pt2->t) return 1;
    return 0;
}

/* Funkcja wczytujaca dane */
void input(void) {
    int i, x, y;
    
    /* Podstawowe parametry */
    scanf("%d %d %d", &bg, &en, &n);
    n_real = 0;
        
    for(i = 0; i < n; i++) {
	scanf("%d %d", &x, &y);
	/* Dopasowujemy przedzial do (bg, en) */
	x = max(x, bg);
	y = min(y, en);
	/* Sprawdzimy czy przedzial jest istotny */
	if (x <= y) {
	    pt[n_real].t = x;
	    pt[n_real].be = BG;
	    n_real++;
	    /* Wstawiamy tylko konce < (ostro) en */
	    if (y < en) {
    		pt[n_real].t = y;
		pt[n_real].be = EN;
		n_real++;
	    }
	}
    }
}

/* Obliczenie wyniku dla posortowanej tablicy pt */
void calcresult(void) {
    int min_sol, max_sol;	/* Wyniki */
    int curr;			/* Chwilowy wynik */
    int i, k, pt_bg, pt_en;
    
    curr = 0;
    i = 0; 
    min_sol = n_real;
    max_sol = 0;
    
    /* Przechodzimy wszystkie punkty */
    while (i < n_real) {
	k = i;
	pt_bg = pt_en = 0;
	/* Zliczamy poczatki i konce w danym punkcie */
	while (i < n_real && pt[i].t == pt[k].t) {
	    if (pt[i].be == BG) pt_bg++;
	    else pt_en++;
	    i++;
	}
	/* Uaktualniamy max, min */
	max_sol = max(max_sol, curr + pt_bg);
	min_sol = min(min_sol, curr + pt_bg - pt_en);
	curr = curr + pt_bg - pt_en;
    }
    
    /* Zapisanie wyniku */
    printf("%d %d\n", min_sol - 1, max_sol - 1);
}

/* Program glowny */
int main(void) {

    input();
    
    /* Dodamy jeszcze poczatek przedzialu (bg, en), potem od wyniku odejmiemy 1 */
    pt[n_real].t = bg; pt[n_real].be = BG; n_real++;
    
    qsort(pt, n_real, sizeof(TTimePt), timept_sort);

    calcresult();
    
    return 0;
}
