#include <bits/stdc++.h>
#define int long long
#define For(i, a, b) for (int i = (a); i <= (b); i ++)
#define foR(i, a, b) for (int i = (a); i >= (b); i --)
using namespace std;
int n, m, k, q;
int b[400005], c[400005], d[400005];
int ans[400005], lst[400005], pre[400005];
vector <int> G[400005], u[400005];
struct Query {int l, r, id;}a[400005];
bool cmp (Query q1, Query q2) {return q1.r < q2.r;}
void add (int x, int y) {if (x) for (; x <= k; x += x & -x) c[x] += y;}
int query (int x) {
int ans = 0;
for (; x; x -= x & -x) ans += c[x];
return ans;
}
void solve () {
cin >> n >> n >> m >> k >> q;
For (i, 1, m) {
int u, v;
cin >> u >> v;
G[u].push_back (v);
++ d[u];
}
For (i, 1, n) {
if (d[i] < 500) continue;
for (int j : G[i]) u[j].push_back (i);
}
For (i, 1, k) cin >> b[i];
For (i, 1, q) {
int l, r;
cin >> l >> r;
a[i] = {l, r, i};
}
sort (a + 1, a + q + 1, cmp);
int tail = 1;
For (i, 1, k) {
lst[1] = i;
add (lst[b[i] ], -1);
if (d[b[i] ] < 500) for (int v : G[b[i] ]) lst[b[i] ] = max (lst[b[i] ], lst[v]);
else lst[b[i] ] = max (lst[b[i] ], pre[b[i] ]);
add (lst[b[i] ], 1);
for (int v : u[b[i] ]) pre[v] = max (pre[v], lst[b[i]]);
while (tail <= q && a[tail].r == i) {
ans[a[tail].id] = query (k) - query (a[tail].l - 1);
tail ++;
}
}
For (i, 1, q) cout << n - 1 - ans[i] << '\n';
}
signed main () {
int _ = 1;
while (_ --) {
solve ();
cout << '\n';
}
return 0;
}