This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
struct dsu{
vector<int>root;
vector<int>siz;
dsu(int n){
root=vector<int>(n);
iota(root.begin(),root.end(),0);
siz=vector<int>(n,1);
}
int sizx(int x){
x=findRoot(x);
return siz[x];
}
bool unite(int x, int y){
x=findRoot(x);
y=findRoot(y);
if(x==y)
return 0;
if(siz[x]<siz[y]){
swap(x,y);
}
root[y]=root[x];
siz[x]+=siz[y];
return 1;
}
int findRoot(int x){
if(x==root[x]){
return x;
}
return root[x]=findRoot(root[x]);
}
};
const int MAX_N=1e5+5;
vector<int>g[MAX_N];
vector<bool>col(MAX_N,0);
void flipdfs(int st, vector<int>(&g)[], int p){
col[st]=!col[st];
for(int i : g[st]){
if(i==p)
continue;
flipdfs(i,g,st);
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n,q;
cin >> n >> q;
dsu ds(n);
while(q--){
int a,b;
char t;
cin >> t >> a >> b;
a--;b--;
if(t=='R'){
if(ds.findRoot(a)==ds.findRoot(b)){
continue;
}
if(ds.sizx(a)<ds.sizx(b)){
swap(a,b);
}
if(col[a]!=col[b])
flipdfs(b,g,-1);
ds.unite(a,b);
g[a].push_back(b);
g[b].push_back(a);
}
else if(t=='A'){
if(ds.findRoot(a)==ds.findRoot(b)){
continue;
}
if(ds.sizx(a)<ds.sizx(b)){
swap(a,b);
}
if(col[a]==col[b])
flipdfs(b,g,-1);
ds.unite(a,b);
g[a].push_back(b);
g[b].push_back(a);
}
else{
if(ds.findRoot(a)!=ds.findRoot(b)){
cout << "?\n";
}
else{
cout << ((col[a]==col[b]) ? "R\n" : "A\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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |