#include #include #include #include #include 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; }