Submission #1118355

#TimeUsernameProblemLanguageResultExecution timeMemory
1118355AvianshExperimental Charges (NOI19_charges)C++17
100 / 100
39 ms7096 KiB
#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 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...
#Verdict Execution timeMemoryGrader output
Fetching results...