#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int maxn = 1e5 + 100;
const int NEG = -1000000000;
int k;
vector<int> add[maxn];
vector<int> rem[maxn];
set<pii> st[maxn];
set<pii> stt[maxn];
int dp[maxn];
void dfs(int x){
for(auto u : rem[x]){
for(auto p : st[u]){
pii tmp = p;
auto ss = stt[x].lower_bound({tmp.second, INT_MIN});
if(ss != stt[x].end() && ss->first == tmp.second){
pii dd = *ss;
if(dd.second < tmp.first + 1){
auto it = st[x].find({dd.second, dd.first});
if(it != st[x].end()) st[x].erase(it);
stt[x].erase(ss);
st[x].insert({tmp.first + 1, tmp.second});
stt[x].insert({tmp.second, tmp.first + 1});
}
} else {
st[x].insert({tmp.first + 1, tmp.second});
stt[x].insert({tmp.second, tmp.first + 1});
}
}
auto ss = stt[x].lower_bound({u, INT_MIN});
if(ss != stt[x].end() && ss->first == u){
if(ss->second < 1){
st[x].erase({ss->second, u});
stt[x].erase(ss);
st[x].insert({1, u});
stt[x].insert({u, 1});
}
} else {
st[x].insert({1, u});
stt[x].insert({u, 1});
}
}
st[x].insert({0, x});
stt[x].insert({x, 0});
while((int)st[x].size() > k){
auto it = st[x].begin();
pii ss = *it;
st[x].erase(it);
auto it2 = stt[x].find({ss.second, ss.first});
if(it2 != stt[x].end()) stt[x].erase(it2);
}
}
void ddfs(int x){
for(auto v : add[x]){
if(dp[v] == NEG) continue;
dp[x] = max(dp[x], dp[v] + 1);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m, q;
cin >> n >> m >> q;
k = sqrt(n) + 1;
for(int i=1;i<=m;i++){
int u, v;
cin >> u >> v;
add[u].push_back(v);
rem[v].push_back(u);
}
for(int i=1;i<=n;i++) dfs(i);
while(q--){
int u;
cin >> u;
int tt;
cin >> tt;
set<int> no;
for(int i=0;i<tt;i++){
int v;
cin >> v;
no.insert(v);
}
if((int)no.size() < k){
int ans = NEG;
for(auto p : st[u]){
if(no.find(p.second) == no.end())
ans = max(ans, p.first);
}
if(ans == NEG) cout << -1 << "\n";
else cout << ans << "\n";
} else {
for(int i=1;i<=n;i++) dp[i] = NEG;
dp[u] = 0;
for(int i=u;i>=1;i--) ddfs(i);
int ans = NEG;
for(int i=1;i<=u;i++){
if(!no.count(i))
ans = max(ans, dp[i]);
}
if(ans == NEG) cout << -1 << "\n";
else cout << ans << "\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... |