#include<bits/stdc++.h>
#define loop(a,b,c,d) for(int a=b; a<c; a+=d)
#define loop2(a,b,c,d) for(int a=b; a>=c; a-=d)
#define bl(i,n) loop(i,0,n,1)
#define bl2(i,n) loop2(i,n,0,1)
#define int long long
#define nl endl
#define g ' '
using namespace std;
pair<int,bool> par[100005];
pair<int,bool> Find(int x){
if(par[x].first == x) return {x, 0};
auto xpar = Find(par[x].first);
return par[x] = {xpar.first, xpar.second ^ par[x].second};
}
void Union(int x, int y, bool c){
auto xpar = Find(x), ypar = Find(y);
if(xpar.first == ypar.first) return;
par[xpar.first] = {ypar.first, c ^ (xpar.second ^ ypar.second)};
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(NULL);cout.tie(NULL);
int n, q;
cin>>n>>q;
bl(i,n) par[i] = {i, 0};
while(q--){
char w;
int a, b;
cin>>w>>a>>b;
a--, b--;
if(w == 'Q'){
auto apar = Find(a), bpar = Find(b);
if(apar.first != bpar.first) cout<<"?\n";
else cout<<((apar.second == bpar.second) ? 'R' : 'A')<<nl;
}else Union(a, b, w == 'A');
}
}
# | 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... |