#include <bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
const int MAXN = 100000 + 5;
const int LIMIT = 320;
int n,m,q;
vector<int> adj[MAXN], revv[MAXN];
vector<pii> dis[MAXN];
bool ban[MAXN];
int f[MAXN];
void MergeVec(vector<pii>& A, const vector<pii>& B){
vector<pii> Binc; Binc.reserve(B.size());
for(auto &p: B) Binc.emplace_back(p.first + 1, p.second);
vector<pii> tmp; tmp.reserve(LIMIT+5);
unordered_set<int> used;
int ia = 0, ib = 0;
while((ia < (int)A.size() || ib < (int)Binc.size()) && (int)tmp.size() < LIMIT){
pii va = {INT_MIN, -1}, vb = {INT_MIN, -1};
if(ia < (int)A.size()) va = A[ia];
if(ib < (int)Binc.size()) vb = Binc[ib];
if(va.first >= vb.first){
if(!used.count(va.second)){
used.insert(va.second);
tmp.push_back(va);
}
ia++;
} else {
if(!used.count(vb.second)){
used.insert(vb.second);
tmp.push_back(vb);
}
ib++;
}
}
A.swap(tmp);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
if(!(cin >> n >> m >> q)) return 0;
for(int i=0;i<m;i++){
int u,v; cin >> u >> v;
adj[u].push_back(v);
revv[v].push_back(u);
}
for(int x = 1; x <= n; ++x){
dis[x].push_back({0, x});
for(int u : revv[x]){
MergeVec(dis[x], dis[u]);
}
}
for(int qi = 0; qi < q; ++qi){
int T, Y; cin >> T >> Y;
vector<int> busy(Y);
for(int i=0;i<Y;i++){ cin >> busy[i]; ban[busy[i]] = true; }
int ans = -1;
if(Y < LIMIT){
for(auto &p : dis[T]){
if(!ban[p.second]){ ans = p.first; break; }
}
} else {
const int NEG = -1000000000;
for(int i=1;i<=T;i++) f[i] = NEG;
f[T] = 0;
if(!ban[T]) ans = 0;
for(int i=T-1;i>=1;i--){
for(int v: adj[i]) if(v <= T) f[i] = max(f[i], f[v] + 1);
if(!ban[i]) ans = max(ans, f[i]);
}
if(ans < -100000000) ans = -1;
}
for(int b: busy) ban[b] = false;
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... |