/**
* author: Jotinha (ツ)
* created: 02-28-2025 11:09:44
**/
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif
const int maxn = 100005, sq = 318;
int tot[maxn], vis[maxn];
vector<int> g[maxn];
vector<pair<int, vector<int>>> qr[maxn];
pair<int, int> dp[maxn][sq];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n, m, q;
cin >> n >> m >> q;
for(int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
--u, --v;
g[u].emplace_back(v);
g[v].emplace_back(u);
}
int t = 0;
for(int i = 0; i < q; i++) {
int u, k;
cin >> u >> k;
--u;
vector<int> v(k);
for(int& j : v) {
cin >> j;
--j;
}
qr[u].emplace_back(make_pair(t++, v));
tot[u] += (int) v.size();
}
auto bfs = [&](int u) {
vector<int> dist(n, -1);
queue<int> qe;
qe.emplace(u);
dist[u] = 0;
while(!qe.empty()) {
auto v = qe.front();
qe.pop();
for(int nxt : g[v]) {
if(nxt < v && dist[nxt] < dist[v] + 1) {
dist[nxt] = dist[v] + 1;
qe.push(nxt);
}
}
}
return dist;
};
const int inf = 0x3f3f3f3f;
for(int i = 0; i < n; i++) {
for(int j = 0; j < sq; j++) {
dp[i][j] = {-inf, -inf};
}
}
function<void(int)> dfs = [&](int u) {
if(vis[u]) {
return;
}
set<pair<int, int>> wait { {0, u} };
for(int nxt : g[u]) {
if(nxt < u) {
dfs(nxt);
for(int i = 0; i < sq && dp[nxt][i].first >= 0; i++) {
wait.insert({dp[nxt][i].first + 1, dp[nxt][i].second});
if((int) wait.size() >= sq) {
wait.erase(wait.begin());
}
}
}
}
int te = (int) wait.size();
for(int i = 0; i < te; i++) {
auto [d, v] = *wait.rbegin();
dp[u][i] = {d, v};
wait.erase(--wait.end());
}
vis[u] = 1;
};
vector<int> ans(t, -1);
for(int i = n - 1; i >= 0; i--) {
if(tot[i] >= sq) {
auto dist = bfs(i);
multiset<int> ms(dist.begin(), dist.end());
ms.insert(-1);
for(int j = 0; j < qr[i].size(); j++) {
for(int nxt : qr[i][j].second) {
ms.erase(ms.find(dist[nxt]));
}
ans[qr[i][j].first] = *ms.rbegin();
for(int nxt : qr[i][j].second) {
ms.insert(dist[nxt]);
}
}
} else {
dfs(i);
// cerr << i + 1 << '\n';
// for(int j = 0; j < 5; j++) {
// cerr << dp[i][j].first << ' ' << dp[i][j].second + 1 << '\n';
// }
// cerr << "------------\n";
for(int j = 0; j < sq; j++) {
for(int k = 0; k < qr[i].size(); k++) {
if(ans[qr[i][k].first] == -1) {
int show = 1;
for(int nxt : qr[i][k].second) {
if(nxt == dp[i][j].second) {
show = 0;
break;
}
}
if(show) {
ans[qr[i][k].first] = dp[i][j].first;
}
}
}
}
}
}
for(int x : ans) {
cout << (x < 0 ? -1 : x) << '\n';
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |