tlq 里的 hack 都过了,看了 1h 还是看不出哪里有问题,请大佬们帮忙。
#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, cnt;
int b[400005], c[400005], d[400005];
int ans[400005], lst[400005], pre[400005];
vector <int> G[400005], u[400005];
vector <pair <int, int> > a[400005];
void add (int x, int y) {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[r].push_back (make_pair (l, i) );
}
int tail = 0;
For (i, 1, k) {
lst[1] = i;
if (lst[b[i] ]) add (lst[b[i] ], -1), -- cnt;
if (d[b[i] ] < 500) for (int v : G[b[i] ]) pre[b[i] ] = max (pre[b[i] ], lst[v]);
lst[b[i] ] = max (max (pre[b[i] ], lst[b[i] ]), pre[b[i] ]);
if (lst[b[i] ]) add (lst[b[i] ], 1), ++ cnt;
for (int v : u[b[i] ]) pre[v] = max (pre[v], lst[b[i]]);
for (auto j : a[i]) ans[j.second] = n - 1 - cnt + query (j.first - 1);
}
For (i, 1, q) cout << ans[i] << '\n';
}
signed main () {
int _ = 1;
// cin >> _;
while (_ --) {
solve ();
cout << '\n';
}
return 0;
}