#ifdef ONLINE_JUDGE #include #else #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif using namespace std; // lambda : [] (int a, int b) -> bool { body return } // string r_str = R"(raw string)" #define mp make_pair #define mt make_tuple #define eb emplace_back #define pb push_back #define fi first #define se second #define LL long long #define ULL unsigned long long #define PI (atan(1) * 4) #define BASE 73 #define NMAX 10000 #define NMAX2 20001 #define MOD1 1000000007 #define ALL(V) (V).begin(), (V).end() #define ALLR(V) (V).rbegin(), (V).rend() #define CRLINE Duxar(__LINE__); #define SHOWME(x) cerr << __LINE__ << ": " << #x << " = " << (x) << endl; #define ENTER putchar('\n'); int dx4[] = {-1, 0, 1, 0}; int dy4[] = {0, 1, 0, -1}; int dx8[] = {-1, -1, 0, 1, 1, 1, 0, -1}; int dy8[] = {0, 1, 1, 1, 0, -1, -1, -1}; void Duxar(int _this_line) { #ifndef ONLINE_JUDGE printf("\n . . . . . . . . . . . . . Passed line - %d\n", _this_line); #endif } bool AreEqual(double a, double b) { return (fabs(a - b) < 1e-10); } template bool GetNr(T &_value) { T _sign = 1; char ch; _value = 0; while(!isdigit(ch = getchar())) { if (ch == -1) { return false; } ch == '-' ? _sign = -1 : _sign = 1 ; } do { _value = _value * 10 + (ch - '0'); } while(isdigit(ch = getchar())); _value *= _sign; return true; } template void PutNr(T _value, char _ch = ' ') { cout << _value << _ch; } int D, N, M; vector values, dp; vector > lastp; vector > leaves; bool ByLast(pair a, pair b) { return a.fi < b.fi; } int main(){ string fileInput = "sum"; #ifdef INFOARENA freopen((fileInput + ".in").c_str(), "r", stdin); freopen((fileInput + ".out").c_str(), "w", stdout); #else #ifndef ONLINE_JUDGE freopen("/Users/duxar/Workplace/Xcode Projects/Selectie/Selectie/input", "r", stdin); // freopen("/Users/duxar/Workplace/Xcode Projects/Selectie/Selectie/result", "w", stdout); #endif #endif int i, j; GetNr(D); GetNr(N); GetNr(M); values.resize(N); lastp.resize(N, vector (D + 1, MOD1)); dp.resize(N, MOD1); leaves.resize(M); for (i = 0; i < N; ++i) { GetNr(values[i]); } for (i = 0; i < M; ++i) { GetNr(leaves[i].fi); GetNr(leaves[i].se); } sort(ALL(leaves), ByLast); sort(ALL(values)); int st, en; for (i = 0; i < M; ++i) { en = lower_bound(ALL(values), leaves[i].se) - values.begin(); if (en == M || en == -1 || values[en] > leaves[i].se) --en; st = lower_bound(ALL(values), leaves[i].fi) - values.begin(); if (st > en) continue; if (st == 0) { // dp[en] = 1; // lastp[en] = min(lastp[en], leaves[i].se); lastp[en][leaves[i].se] = 1; } else { for (j = 1; j < leaves[i].fi; ++j) { if (lastp[st - 1][j]) { lastp[en][leaves[i].se] = min(lastp[en][leaves[i].se], lastp[st - 1][j] + 1); // if (dp[en] > dp[st - 1] + 1) { // dp[en] = dp[st - 1] + 1; // lastp[en] = leaves[i].se; // } // else if (dp[en] == dp[st - 1] + 1) { // lastp[en] = min(lastp[en], leaves[i].se); // } } } } } int ans = MOD1; for (i = 1; i <= D; ++i) { ans = min(lastp[N - 1][i], ans); } PutNr(ans, '\n'); return 0; }