调了 3h 了,一直看不出为啥 WA。
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 2e5 + 10;
int c, n, m, k, q, u, v, a[N], d[N], lst[N], fg[N], idx = 0, sqrtm;
bool is1[N];
struct line{
int l, r, id, ans;
bool operator < (const line & o) const{
return r < o.r;
}
} b[N];
bool cmp(line x, line y){
return x.id < y.id;
}
vector<int> g[N], gn[N];
void add(int x, int xx){
x = k - x + 1;
while(x <= k+1){
d[x] += xx;
x += x & -x;
}
}
int get(int x){
x = k - x + 1;
int ret = 0;
while(x){
ret += d[x];
x -= x & -x;
}
return ret;
}
int main(){
cin >> c >> n >> m >> k >> q;
sqrtm = sqrt(m);
for(int i = 0; i < m; i++){
cin >> u >> v;
g[u].push_back(v);
if(v == 1) is1[u] = 1;
}
for(int i = 1; i <= n; i++){
if(g[i].size() >= sqrtm){
for(int j: g[i]) gn[j].push_back(i);
}
}
for(int i = 1; i <= k; i++) cin >> a[i];
for(int i = 0; i < q; i++){
cin >> b[i].l >> b[i].r;
b[i].id = i;
}
sort(b, b + q);
for(int i = 1; i <= k; i++){
u = a[i];
add(lst[u], -1);
if(is1[u]) lst[u] = i;
else if(g[i].size() >= sqrtm){
lst[u] = max(lst[u], fg[u]);
}
else{
for(int v: g[u]){
lst[u] = max(lst[u], lst[v]);
}
}
for(int v: gn[u]){
fg[v] = max(fg[v], lst[u]);
}
add(lst[u], 1);
while(idx < q && b[idx].r == i){
b[idx].ans = n - 1 - get(b[idx].l);
idx++;
}
}
sort(b, b + q, cmp);
for(int i = 0; i < q; i++) cout << b[i].ans << '\n';
return 0;
}