#include <bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
const int nmax = 100000 + 69;
const int block = 320;
int n,m,q;
vector<int> adj[nmax];
vector<pii> savev[nmax];
int cnt[nmax];
int vst[nmax];
void input(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m >> q;
for(int i=1;i<=m;i++){
int u,v; cin >> u >> v;
adj[max(u,v)].push_back(min(u,v));
}
}
vector<pii> merge_vec(const vector<pii> &a, const vector<pii> &b){
vector<pii> c;
c.reserve(min((int)a.size() + (int)b.size(), block+5));
int pta=0, ptb=0;
while(pta < (int)a.size() && ptb < (int)b.size()){
if(a[pta] > b[ptb]){
if(!cnt[a[pta].second]) c.push_back(a[pta]);
cnt[a[pta].second]++; pta++;
} else {
if(!cnt[b[ptb].second]) c.push_back(b[ptb]);
cnt[b[ptb].second]++; ptb++;
}
}
for(int i=pta;i<(int)a.size();++i){ if(!cnt[a[i].second]) c.push_back(a[i]); cnt[a[i].second]++; }
for(int i=ptb;i<(int)b.size();++i){ if(!cnt[b[i].second]) c.push_back(b[i]); cnt[b[i].second]++; }
for(auto &p: c) cnt[p.second] = 0;
if((int)c.size() > block) c.resize(block);
return c;
}
void pre_dfs(int u,int p){
vst[u]=1;
for(int v: adj[u]){
if(v==p) continue;
if(!vst[v]) pre_dfs(v,u);
for(auto &pr : savev[v]) pr.first++;
savev[u] = merge_vec(savev[u], savev[v]);
for(auto &pr : savev[v]) pr.first--;
}
}
void build(){
for(int i=1;i<=n;i++) savev[i].clear(), savev[i].push_back({0,i});
for(int i=1;i<=n;i++) vst[i]=0;
for(int i=n;i>=1;i--) if(!vst[i]) pre_dfs(i,0);
}
int busy_ver[nmax];
int visit_ver[nmax];
int curVer = 1;
int dp_val[nmax];
void solve(){
build();
while(q--){
curVer++;
int t,y; cin >> t >> y;
for(int i=0;i<y;i++){
int x; cin >> x;
busy_ver[x] = curVer;
}
if(y <= block){
bool ok = false;
for(auto &pr : savev[t]){
int node = pr.second;
if(busy_ver[node] != curVer){
cout << pr.first << '\n';
ok = true;
break;
}
}
if(!ok) cout << -1 << '\n';
continue;
}
// heavy query: iterative post-order DFS from t
stack<tuple<int,int,int>> st;
st.emplace(t, 0, 0);
while(!st.empty()){
auto [u, p, state] = st.top(); st.pop();
if(state == 0){
if(visit_ver[u] == curVer) continue;
visit_ver[u] = curVer;
st.emplace(u, p, 1);
for(int v: adj[u]) if(v != p) st.emplace(v, u, 0);
} else {
if(busy_ver[u] == curVer){
dp_val[u] = -1;
} else {
int best = 0;
for(int v: adj[u]) if(v != p){
int child = dp_val[v];
if(child == -1) continue;
if(child + 1 > best) best = child + 1;
}
dp_val[u] = best;
}
}
}
int out = dp_val[t];
if(busy_ver[t] == curVer) cout << -1 << '\n';
else cout << out << '\n';
}
}
int main(){
input();
solve();
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... |