Submission #551491

#TimeUsernameProblemLanguageResultExecution timeMemory
551491sidonInside information (BOI21_servers)C++17
50 / 100
285 ms33248 KiB
#include <bits/stdc++.h>
using namespace std;

const int Z = 1.2e5, B = 17;

int N, K, p[Z][B], up[Z][2], d[Z], pE[Z], res[Z];
vector<array<int, 2>> g[Z], h[Z];
vector<array<int, 4>> pQ;

void init(const int &u) {
	for(int i = 0; i + 1 < B; ++i)
		p[u][i+1] = p[p[u][i]][i];

	for(const auto &[v, i] : g[u]) if(v != p[u][0]) {
		p[v][0] = u;
		d[v] = d[u] + 1;
		pE[v] = i;

		if(pE[u] < i) {
			up[v][0] = up[u][0];
			up[v][1] = u;
		} else {
			up[v][0] = u;
			up[v][1] = up[u][1];
		}

		init(v);
	}
}

int _u, _v;

int lca(int u, int v) {
	bool swapped = 0;
	if((swapped = (d[u] < d[v]))) swap(u, v);

	if(d[u] > d[v]) {
		for(int i = B; i--; ) if((d[u] - d[v] - 1) & (1<<i))
			u = p[u][i];

		if(p[u][0] == v) {
			_u = u;
			return v;
		}
		u = p[u][0];
	}

	for(int i = B; i--; ) if(p[u][i] != p[v][i])
		u = p[u][i], v = p[v][i];
	if(swapped) swap(u, v);
	_u = u, _v = v;
	return p[u][0];
}

int main() {
	cin >> N >> K;

	for(int i {}, j {}; i < N - 1 + K; ++i) {
		char t; int u, v;
		cin >> t >> u; --u;
		if(t == 'S') {
			cin >> v; --v;
			g[u].push_back({v, i});
			g[v].push_back({u, i});
		}
		if(t == 'Q') {
			cin >> v; --v;
			pQ.push_back({j++, i, u, v});
		}

		if(t == 'C')
			h[u].push_back({j++, i});
	}

	init(0);

	for(const auto &[j, i, u, v] : pQ) {
		int w = lca(u, v), val = w == u ? pE[_u] : pE[u];

		if(w != u && w != v && pE[_u] < pE[_v])
			val = i;

		if(u == v || (max(d[up[u][0]], d[up[v][1]]) <= d[w] && val < i))
			res[j] = -1;
		else
			res[j] = -2;
	}

	for(int j = 0; j < K; ++j) {
		if(res[j] < 0) cout << (res[j] & 1 ? "yes" : "no");
		else assert(0);
		cout << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...