#include<bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
#define X first
#define Y second
#define pb push_back
const int MXN = 1e5+5;
const int sq  = 300;
int n, m, q, dis[MXN];
vector<int> g[MXN];
pii dp[MXN][sq];
pii tmp[sq];
bool mark[MXN];
int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    cin >> n >> m >> q;
    for(int i=0, u,v; i<m; i++) {
        cin >> u >> v;
        g[v].pb(u);
    }
    for(int v=1; v<=n; v++) {
        dp[v][0] = pii(0, v);
        fill(dp[v]+1, dp[v]+sq, pii(-1, -1));
        for(int u : g[v]) {
            int i=0, j=0, k=0;
            while(i<sq && dp[v][i].X!=-1 && j<sq && dp[u][j].X!=-1 && k<sq)
                if(dp[v][i].X>=dp[u][j].X+1){
                    if(!mark[dp[v][i].Y]) tmp[k++] = dp[v][i];
                    mark[dp[v][i].Y]=1;
                    i++;
                }
                else {
                    if(!mark[dp[u][j].Y]) tmp[k++] = pii(dp[u][j].X+1, dp[u][j].Y);
                    mark[dp[u][j].Y]=1;
                    j++;
                }
            while(i<sq && dp[v][i].X!=-1 && k<sq) {
                if(!mark[dp[v][i].Y]) tmp[k++] = dp[v][i];
                mark[dp[v][i].Y]=1;
                i++;
            }
            while(j<sq && dp[u][j].X!=-1 && k<sq) {
                if(!mark[dp[u][j].Y]) tmp[k++] = pii(dp[u][j].X+1, dp[u][j].Y);
                mark[dp[u][j].Y]=1;
                j++;
            }
            for(int x=0; x<k; x++)
                mark[(dp[v][x]=tmp[x]).Y] = 0;
        }
    }
    while(q--) {
        int t, y;
        cin >> t >> y;
        vector<int> c(y);
        for(int &i : c) cin >> i;
        for(int i : c) mark[i] = 1;
        if(y<sq) {
            int ans=-1;
            for(int i=0; i<sq; i++)
                if(dp[t][i].X!=-1 && !mark[dp[t][i].Y]) {
                    ans = dp[t][i].X;
                    break;
                }
            cout << ans << '\n';
        }
        else {
            fill(dis+1, dis+n+1, -1e9);
            dis[t] = 0;
            int ans=-1;
            for(int v=t; v>=1; v--) {
                for(int u : g[v])
                    dis[u] = max(dis[u], dis[v]+1);
                if(!mark[v]) ans = max(ans, dis[v]);
            }
            cout << ans << '\n';
        }
        for(int i : c) mark[i] = 0;
    }
    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... |