Submission #1292483

#TimeUsernameProblemLanguageResultExecution timeMemory
1292483chaitanyamehtaLost Array (NOI19_lostarray)C++20
0 / 100
3 ms336 KiB
#include <bits/stdc++.h> using namespace std; struct DSU { int n; vector<int> parent, sz, parity; void init(int N){ n = N; parent.resize(n+1); sz.assign(n+1, 1); parity.assign(n+1, 0); for(int i = 0; i <= n; ++i) parent[i] = i; } int find(int x){ int cur = x; int acc = 0; while(parent[cur] != cur){ acc ^= parity[cur]; cur = parent[cur]; } int root = cur; cur = x; int pref = 0; while(parent[cur] != cur){ int p = parent[cur]; int old_par = parity[cur]; parent[cur] = root; parity[cur] = acc ^ pref; pref ^= old_par; cur = p; } return root; } int getParity(int x){ find(x); return parity[x]; } void unite(int u, int v, int rel){ int ru = find(u); int rv = find(v); if(ru == rv) return; int pu = getParity(u); int pv = getParity(v); int need = pu ^ pv ^ rel; if(sz[ru] < sz[rv]) swap(ru, rv); parent[rv] = ru; parity[rv] = need; sz[ru] += sz[rv]; } }; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n, q; if(!(cin >> n >> q)) return 0; DSU dsu; dsu.init(n); while(q--){ char t; int u, v; cin >> t >> u >> v; if(t == 'R') dsu.unite(u, v, 0); else if(t == 'A') dsu.unite(u, v, 1); else if(t == 'Q'){ int ru = dsu.find(u), rv = dsu.find(v); if(ru != rv) cout << "?\n"; else { int pu = dsu.getParity(u), pv = dsu.getParity(v); if((pu ^ pv) == 1) cout << "A\n"; else cout << "R\n"; } } } return 0; }
#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...