Submission #938242

#TimeUsernameProblemLanguageResultExecution timeMemory
938242Gromp15Inside information (BOI21_servers)C++17
2.50 / 100
3570 ms15668 KiB
#include <bits/stdc++.h>
#define ll long long
#define ar array
#define db double
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define rint(l, r) uniform_int_distribution<int>(l, r)(rng)
template<typename T> bool ckmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; }
template<typename T> bool ckmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }
const int INF = 1e9;
void test_case() {
	int n, q;
	cin >> n >> q;
	vector<vector<ar<int, 2>>> adj(n+1);
	vector<ar<int, 5>> queries;
	vector<int> ans(q);
	vector<bool> type(q);
	for (int i = 0, qidx = 0; i < n + q - 1; i++) {
		char c; cin >> c;
		int x, y;
		cin >> x;
		if (c != 'C') cin >> y;
		if (c == 'S') {
			adj[x].push_back({y, i});
			adj[y].push_back({x, i});
		}
		else {
			if (c == 'Q') {
				queries.push_back({0, x, y, qidx++, i});
			}
			else {
				queries.push_back({1, x, -1, qidx++, i});
			}
		}
	}
	for (auto [tp, x, y, ans_idx, time] : queries) {
		if (tp == 0) {
			vector<int> dist(n+1, -1);
			dist[x] = time;
			auto dfs = [&](auto&& s, int v) -> void {
				for (auto [u, w] : adj[v]) if (dist[v] >= w && ckmax(dist[u], w)) {
					s(s, u);
				}
			};
			dfs(dfs, x);
			type[ans_idx] = 1;
			ans[ans_idx] = bool(~dist[y]); // good if it's not -1
		}
		else {
			vector<int> dist(n+1, INF);
			dist[x] = -1;
			auto dfs = [&](auto&& s, int v) -> void {
				for (auto [u, w] : adj[v]) if (dist[v] <= w && ckmin(dist[u], w)) {
					s(s, u);
				}
			};
			for (auto [u, w] : adj[x]) if (w <= time) {
				dist[u] = w;
				dfs(dfs, u);
			}
			int cnt = 0;
			for (int i = 1; i <= n; i++) {
				cnt += dist[i] < INF;
			}
			ans[ans_idx] = cnt;
		}
	}
	for (int i = 0; i < q; i++) {
		if (type[i]) {
			cout << (ans[i] ? "yes":"no") << '\n';
		}
		else cout << ans[i] << '\n';
	}




}
int main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
//    cin >> t;
    while (t--) test_case();
}

#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...