/**
* 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
vector<pair<int, vector<int>>> qr[100005];
pair<int, int> dp[100005][318];
void countingSort(vector<int>& arr, int mn = 0, int mx = 100000){
int i, k = 0, sizeTemp = mx - mn + 1;
vector<int> temp(sizeTemp);
for(i = 0; i< sizeTemp; i++){
temp[i] = 0;
}
for(i = 0; i < (int) arr.size(); i++){
temp[arr[i] - mn]++;
}
for (i = mx; i >= mn; i--){
while(temp[i - mn]-- > 0){
arr[k++] = i;
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n, m, q;
cin >> n >> m >> q;
vector<vector<int>> g(n);
for(int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
--u, --v;
if(u < v) {
swap(u, v);
}
g[u].push_back(v);
}
vector<int> tot(n);
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);
function<int(int)> dp = [&](int v) {
int& p = dist[v];
if(p != -1) {
return p;
}
int ret = 0;
for(int nxt : g[v]) {
ret = max(ret, dp(nxt) + 1);
}
return p = ret;
};
dp(u);
return dist;
};
const int sq = 1;
const int inf = 0x3f3f3f3f;
for(int i = 0; i < n; i++) {
for(int j = 0; j < sq; j++) {
dp[i][j] = {-inf, -inf};
}
}
vector<int> h(n);
auto merge = [&](pair<int, int>* a, pair<int, int>* b) {
pair<int, int> c[sq];
int at = 0;
int l = 0, r = 0;
while(at < sq && l < sq && r < sq) {
auto [d1, v1] = a[l];
auto [d2, v2] = b[r];
d2++;
if(v1 < 0 or h[v1]) {
l++;
continue;
}
if(v2 < 0 or h[v2]) {
r++;
continue;
}
if(v1 >= 0 && d1 > d2) {
l++;
h[v1] = 1;
c[at++] = {d1, v1};
} else if(v2 >= 0 && !h[v2]){
r++;
h[v2] = 1;
c[at++] = {d2, v2};
}
}
while(at < sq && l < sq) {
if(a[l].second < 0 or h[a[l].second]) {
l++;
continue;
}
c[at++] = a[l++];
}
while(at < sq && r < sq) {
if(b[r].second < 0 or h[b[r].second]) {
r++;
continue;
}
c[at++] = b[r++];
}
l = 0;
while(l < sq) {
if(a[l].second >= 0) {
h[a[l].second] = 0;
}
if(b[l].second >= 0) {
h[b[l].second] = 0;
}
l++;
}
for(int i = 0; i < at; i++) {
a[i] = c[i];
}
};
vector<int> vis(n);
function<void(int)> dfs = [&](int u) {
if(vis[u]) {
return;
}
dp[u][0] = {0, u};
for(int nxt : g[u]) {
dfs(nxt);
merge(dp[u], dp[nxt]);
}
vis[u] = 1;
};
vector<int> ans(t, -2);
for(int i = n - 1; i >= 0; i--) {
if(tot[i] >= sq) {
auto dist = bfs(i);
auto d2 = dist;
for(int j = 0; j < n; j++) {
d2[j] += 1;
}
countingSort(d2);
for(int j = 0; j < (int) qr[i].size(); j++) {
sort(qr[i][j].second.begin(), qr[i][j].second.end(), [&](int x, int y) {
return dist[x] > dist[y];
});
int ge = 1;
for(int k = 0; k < (int) qr[i][j].second.size(); k++) {
if(dist[qr[i][j].second[k]] != d2[k] - 1) {
ans[qr[i][j].first] = d2[k] - 1;
ge = 0;
break;
}
}
if(ge) {
if((int) qr[i][j].second.size() == n) {
ans[qr[i][j].first] = -1;
} else {
ans[qr[i][j].first] = d2[(int) qr[i][j].second.size()] - 1;
}
}
}
} else {
dfs(i);
for(int j = 0; j < sq; j++) {
for(int k = 0; k < (int) qr[i].size(); k++) {
if(ans[qr[i][k].first] == -2) {
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... |