#include <bits/stdc++.h>
using namespace std;
const int N = 100'000 + 10,
S = 300;
int n, m, q;
vector<int> ad[N], rAd[N];
int deg[N];
bool isBan[N];
int d[N];
vector<pair<int, int>> fB[N];
int fS[N];
int32_t main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> m >> q;
for (int i = 1; i <= m; ++i) {
int u, v; cin >> u >> v;
ad[u].push_back(v);
rAd[v].push_back(u);
}
vector<int> order;
{ // toposort
for (int u = 1; u <= n; ++u) {
for (const auto& v : ad[u]) deg[v] += 1;
}
queue<int> q;
for (int i = 1; i <= n; ++i) if (!deg[i]) q.push(i);
while (q.size()) {
auto u = q.front(); q.pop();
order.push_back(u);
for (const auto& v : ad[u]) {
if (!--deg[v]) q.push(v);
}
}
}
for (int i = 1; i <= n; ++i) fB[i].push_back({-1, i});
for (const auto& u : order) {
{ // sort fB[u]
vector<int> tmp;
for (const auto& [dist, x] : fB[u]) tmp.push_back(x), d[x] = 0;
for (const auto& [dist, x] : fB[u]) d[x] = max(d[x], dist + 1);
fB[u].clear();
sort(tmp.begin(), tmp.end());
tmp.erase(unique(tmp.begin(), tmp.end()), tmp.end());
sort(tmp.begin(), tmp.end(), [&](const auto& a, const auto& b) {
return d[a] > d[b];
});
tmp.resize(min((int)tmp.size(), S));
for (const auto& x : tmp) fB[u].push_back({d[x], x});
}
for (const auto& v : ad[u]) {
fB[v].insert(fB[v].end(), fB[u].begin(), fB[u].end());
}
}
reverse(order.begin(), order.end());
while (q--) {
int x, k; cin >> x >> k;
vector<int> banList(k);
for (auto& v : banList) cin >> v, isBan[v] = true;
int answer = -1;
if (k > S) {
fill(fS + 1, fS + n + 1, -1'000'000);
fS[x] = 0;
for (const auto& u : order) {
for (const auto& v : rAd[u]) fS[v] = max(fS[v], fS[u] + 1);
if (!isBan[u]) answer = max(answer, fS[u]);
}
} else {
for (const auto& [dist, v] : fB[x]) {
if (!isBan[v]) answer = max(answer, dist);
}
}
cout << answer << "\n";
for (const auto& v : banList) isBan[v] = false;
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |