#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |