Submission #1126657

#TimeUsernameProblemLanguageResultExecution timeMemory
1126657Mikael639Bitaro’s Party (JOI18_bitaro)C++20
7 / 100
1518 ms589824 KiB
#include <bits/stdc++.h>

#define For(i, a, b) for (int i = (a); i <= (b); ++i)
#define ForD(i, a, b) for (int i = (a); i >= (b); --i)
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define repD(i, n) for (int i = (n) - 1; i >= 0; --i)

#define pb push_back

#define sz(x) (int)x.size()

#define endl '\n'

#define fi first
#define se second

#define ii pair<int, int>
#define vi vector<int>

using namespace std;

template <class X, class Y>
	bool minimize(X &x, Y y){
		if (x > y){
			x = y;
			return 1;
		}
		
		return 0;
	}

template <class X, class Y>
	bool maximize(X &x, Y y){
		if (x < y){
			x = y;
			return 1;
		}
		
		return 0;
	}


const int N = 1e6 + 5;
const int B = 120;
const int INF = 1e9;

int n, m, q, busy_pussy[N];
vi g[N];
bool seen[N], busy[N];
int dp[N];

set<ii, greater<>> st[N];

void dfs(int u, bool mark){
	seen[u] = 1;
	dp[u] = busy[u] ? -INF : 0;
	
	if (mark) st[u].insert({0, u});
	
	for (int v: g[u]){
		if (!seen[v]) dfs(v, mark);
		maximize(dp[u], dp[v] + 1);
		
		if (!mark) continue;
		for (ii p: st[v]){
			++p.fi;
			
			if (sz(st[u]) < B) st[u].insert(p);
			else{
				if (st[u].begin()->fi >= p.fi) break;
				st[u].erase(st[u].begin());
				st[u].insert(p);
			}
		}
	}
}

signed main(){

	ios_base::sync_with_stdio(0); 
	cin.tie(0); cout.tie(0);
	
	cin >> n >> m >> q;
	rep(i, m){
		int u, v; cin >> u >> v;
		g[v].pb(u);
	}
	
	ForD(i, n, 1) if (!seen[i])
		dfs(i, 1);
	
	while (q--){
		int u, k; cin >> u >> k;
		int cnt = 0;
		rep(i, k){
			cin >> busy_pussy[i];
			if (busy_pussy[i] > u) continue;
			
			++cnt;
			busy[busy_pussy[i]] = 1;	
		}
		
		if (cnt < sz(st[u])){
			bool ok = 0;
			for (auto [d, v]: st[u]) if (!busy[v]){
				cout << d << '\n';
				ok = 1;
				break;
			}
			if (!ok) cout << -1 << '\n';
		}
		else{
			For(i, 1, n){
				dp[i] = busy[i] ? -INF : 0;
				for (int j: g[i]){
					maximize(dp[i], dp[j] + 1);
				}
			}
			cout << (dp[u] >= 0 ? dp[u] : -1) << '\n';
		}
		
		rep(i, k) busy[busy_pussy[i]] = 0;	
	}

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...