#include <bits/stdc++.h>
using namespace std;
struct DSU {
vector <int> link, sz, charge;
vector <vector <int>> adj;
DSU (int n) {
link = sz = charge = vector <int> (n+1);
adj.resize(n+1);
for (int i = 1; i <= n; i++) {
link[i] = i;
charge[i] = 1;
sz[i] = 1;
}
}
int head(int x) {
if (link[x] == x)
return x;
return head(link[x]);
}
bool same(int a, int b) {
return head(a) == head(b);
}
void unite(int a, int b, bool attract) {
if (sz[head(a)] < sz[head(b)])
swap(a, b);
if ((attract && charge[a] == charge[b]) || (!attract && charge[a] != charge[b])) {
b = head(b);
dfs(b, b);
}
a = head(a);
b = head(b);
link[b] = a;
sz[a] += sz[b];
adj[a].push_back(b);
adj[b].push_back(a);
}
void dfs(int s, int p) {
charge[s] = 1 - charge[s];
for (auto i : adj[s]) {
if (i == p)
continue;
dfs(i, s);
}
}
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, q;
cin >> n >> q;
DSU dsu(n+1);
for (int i = 0; i < q; i++) {
char mode;
int a, b;
cin >> mode >> a >> b;
if (mode == 'Q') {
if (dsu.same(a, b)) {
if (dsu.charge[a] == dsu.charge[b])
cout << "R\n";
else
cout << "A\n";
} else {
cout << "?\n";
}
} else {
if (mode == 'A')
dsu.unite(a, b, true);
else
dsu.unite(a, b, false);
}
}
}
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |