제출 #1292483

#제출 시각아이디문제언어결과실행 시간메모리
1292483chaitanyamehtaLost Array (NOI19_lostarray)C++20
0 / 100
3 ms336 KiB
#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 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...