Submission #576829

#TimeUsernameProblemLanguageResultExecution timeMemory
576829thiago_bastosBitaro’s Party (JOI18_bitaro)C++17
100 / 100
1135 ms251292 KiB
#include <bits/stdc++.h>

using namespace std;

using i64 = long long;
using u64 = unsigned long long;
using ld = long double;
using ii = pair<int, int>;

const int N = 1e5 + 100;
const int B = 300;
const int INF = 1e9;

vector<int> g[N];
vector<ii> dp[N];
ii tmp[B];
int id[N], tms = 1, n, m, q;

void merge(vector<ii>& dest, vector<ii>& src) {
	int i = 0, j = 0, k = 0;
	int n = size(dest), m = size(src);

	while(i < n && j < m && k < B) {
		auto [du, u] = dest[i];
		auto& [dv, v] = src[j];
		
		++dv;

		if(id[u] == tms) {
			++i, --dv;
			continue;		
		} else if(id[v] == tms) {
			++j, --dv;
			continue;
		} else if(du > dv) {
			id[u] = tms;
			tmp[k++] = dest[i++];
		} else {
			id[v] = tms;
			tmp[k++] = src[j++];
		}
		
		--dv;
	}
	
	
	while(i < n && k < B) {
		auto [du, u] = dest[i++];
		if(id[u] == tms) continue;
		tmp[k++] = dest[i - 1];
	}

	while(j < m && k < B) {
		auto& [dv, v] = src[j++];
		++dv;
		if(id[v] != tms) tmp[k++] = src[j - 1];
		--dv;
	}

	dest.resize(k);
	for(int i = 0; i < k; ++i) dest[i] = tmp[i];

	++tms;
}

void solve() {

	cin >> n >> m >> q;

	for(int i = 0; i < m; ++i) {
		int u, v;
		cin >> u >> v;
		--u, --v;
		g[u].push_back(v);
	}

	for(int i = 0; i < n; ++i) dp[i].emplace_back(0, i);

	for(int u = 0; u < n; ++u)
		for(int v : g[u])
			merge(dp[v], dp[u]);
	
	vector<int> dist(n);

	for(int i = 0; i < q; ++i) {
		int s, y, ans = -1;

		cin >> s >> y;

		--s;

		if(y >= B) {

			fill(dist.begin(), dist.end(), 0);

			for(int j = 0; j < y; ++j) {
				int u;	
				cin >> u;
				dist[u - 1] = -INF;
			}

			for(int u = 0; u <= s; ++u)
				for(int v : g[u])
					dist[v] = max(dist[v], dist[u] + 1);
			
			cout << max(-1, dist[s]) << '\n';
		} else {

			for(int j = 0; j < y; ++j) {
				int u;	
				cin >> u;
				id[u - 1] = tms;
			}

			for(auto [d, u] : dp[s]) {
				if(id[u] == tms) continue;
				ans = max(ans, d);
			}

			cout << ans << '\n';
			++tms;
		}
	}
}

int main() {
	ios_base :: sync_with_stdio(false);
	cin.tie(0);
	int t = 1;
	//cin >> t;
	while(t--) solve();
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...