#include <iostream>
#include <algorithm>
#include <set>
#include <cstring>
#include <vector>

using namespace std;

const int NMAX = 1000;
const int DMAX = 1000;
const int INF  = (1 << 20);

struct DAP {
    int x,y;
};

bool cmp( DAP A, DAP B ) {
    return (A.y < B.y || (A.y==B.y && A.x < B.x) );
}

int s[DMAX+5];
vector < DAP > inter[DMAX+5];
int d[DMAX+5];
int N, D, M, LAST_BAN = 0, Ans = DMAX * DMAX;

int main() {
    cin >> D >> N >> M;
    for( int i = 1;  i <= N;  ++i ) {
        int x;
        cin >> x;
        LAST_BAN = max( LAST_BAN, x );
        s[x] = 1;
    }
    for( int i = 1;  i <= D;  ++i )  s[i] = s[i-1] + s[i];

    for( int i = 1;  i <= M;  ++i ) {
        DAP A;
        cin >> A.x >> A.y;
        inter[ A.y ].push_back( A );
    }

    for( int i = 1;  i <= D;  ++i ) {
        int LA = DMAX;
        for( int j = 0;  j < (int)inter[i].size();  ++j ) {
            int Y = i;
            int X = inter[i][j].x;
            if( s[Y] - s[X-1] == 0 ) continue;
            if( d[X-1] == 0 && s[X-1] ) continue;
            LA = min( LA, d[X-1] + 1 );
        }
        if( LA != DMAX ) {
            d[i] = LA;
            int ind = i + 1;
            while( s[ind] - s[ind - 1] == 0 )  {
                if( d[ind] == 0 )  d[ind] = LA;
                if( d[ind] != 0 )  d[ind] = min( d[ind], LA );
                ++ind;
            }
        }
    }
    for( int i = LAST_BAN;  i <= DMAX;  ++i ) {
        if( d[i] != 0 ) {
            Ans = min( Ans, d[i] );
        }
    }
    cout << Ans << '\n';
    return 0;
}