#include #include using namespace std; struct Interval { int x, y; }; int n; int z [1005], z2 [1005]; Interval I [1005]; int st [1005]; class MyComp { public : bool operator () (const Interval &A, const Interval &B) { return A.y < B.y || (A.y == B.y && A.x < B.x); } }; int binarySearch (const int &value) { int i, step; for (i = 0, step = (1 << 10); step; step >>= 1) if (i + step <= z2 [0] && z2 [i + step] < value) i = i + step; return i; } int binarySearch2 (const int &value) { int i, step; for (i = 0, step = (1 << 10); step; step >>= 1) if (i + step <= z2 [0] && z2 [i + step] <= value) i = i + step; return i; } int main () { int d, m, x, y, u = 0, kx, ky, i, kkx, kky; // freopen ("date.in", "r", stdin); scanf ("%d%d%d", &d, &n, &m); for (i = 1; i <= n; i ++) { scanf ("%d", &z [i]); } sort (z + 1, z + 1 + n); z [n + 1] = z [n] - 10; for (i = 1; i <= n; i ++) if (z [i] == z [i + 1]) continue; else z2 [++ z2 [0]] = z [i]; u = 0; for (i = 1; i <= m; i ++) { scanf ("%d%d", &x, &y); if (x > y) swap (x, y); kx = binarySearch (x); kx ++; ky = binarySearch2 (y); if (kx <= ky && kx <= z2 [0] && ky <= z2 [0] && kx >= 1 && ky >= 1) { I [++ u].x = kx; I [u].y = ky; } } sort (I + 1, I + 1 + u, MyComp ()); st [0] = 0; st [++ st [0]] = 1; for (i = 2; i <= u; i ++) { kx = I [st [st [0]]].x; ky = I [st [st [0]]].y; if (kx <= I [i].x && I [i].y <= ky) continue; while (st [0]) { if (I [i].x <= kx && ky <= I [i].y) { -- st [0]; kx = I [st [st [0]]].x; ky = I [st [st [0]]].y; } else if (st [0] >= 2) { kkx = I [st [st [0] - 1]].x; kky = I [st [st [0] - 1]].y; if (I [i].x <= kky + 1) { st [0] --; kx = I [st [st [0]]].x; ky = I [st [st [0]]].y; } else break; } else break; } st [++ st [0]] = i; } printf ("%d\n", st [0]); return 0; }