Submission #1271587

#TimeUsernameProblemLanguageResultExecution timeMemory
1271587bourbonAlternating Heights (CCO22_day1problem1)C++20
25 / 25
571 ms4588 KiB
#include<bits/stdc++.h>

using namespace std;


int main() {

	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	int n,k,q;
	cin >> n >> k >> q;
	vector<int> a(n);
	for(int i = 0; i < n; ++i) {
		cin >> a[i];
		a[i]--;
	}




	vector<int> best(n);
	vector<vector<int>> adj(k);
	vector<int> vis(k);
	bool found = false;

	auto dfs = [&](auto && dfs, int u) -> bool {
		if(found) return found;
		vis[u] = 1;
		bool res = false;
		vector<int> p;
		for(auto v : adj[u]) {

			if(vis[v] == 1) {
				found = true;
				return true;
			}

			if(vis[v] == 2) continue;
			p.emplace_back(v);
		}

		for(int v : p) res |= (dfs(dfs,v));

		vis[u] = 2;

		return res;
	};

	auto check = [&](int l, int r) -> bool {

		found = false;
		if(l == r) return true;

		for(int i = 0; i < k; ++i) {
			adj[i].clear();
			vis[i] = 0;
		}

		int d = 0;
		for(int i = l; i < r; ++i) {
			if(d) {
				adj[a[i]].emplace_back(a[i + 1]);
			}
			else adj[a[i + 1]].emplace_back(a[i]);
			d ^= 1;
		}
		bool bad = false;
		for(int i = 0; i < k; ++i) {
			if(vis[i] == 0) bad |= dfs(dfs, i);
		}

		return !bad;
	};

	for(int i = 0; i < n; ++i) {
		int low = (i == 0 ? i : best[i - 1]), high = n - 1;
		while(low <= high) {
			int mid = (low + high) >> 1;
			if(check(i, mid)) {
				best[i] = mid;
				low = mid + 1;
			}
			else high = mid - 1;
		}

		//cout << "$ " << i << " " <<  best[i] << '\n';
	}

	for(int i = 0; i < q; ++i) {
		int l,r;
		cin >> l  >> r;
		--l;--r;
		if(best[l] >= r) {
			cout << "YES\n";
		}
		else cout << "NO\n";
	}


}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...