Cod sursa(job #3298500)

Utilizator rneg2001reiNegru Radu-Andrei rneg2001rei Data 30 mai 2025 16:32:46
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>
using namespace std;

struct disset{
    vector<int> tata, rangv;
    disset(int n): tata(n+1), rangv(n+1, 0) {
        for(int i = 1; i <= n; ++i)
            tata[i] = i;
    }
    int find(int x){
        if(tata[x] != x)
            tata[x] = find(tata[x]);
        return tata[x];
    }
    void unite(int x, int y){
        int rx = find(x);
        int ry = find(y);
        if(rx == ry) return;
        if(rangv[rx] < rangv[ry]){
            tata[rx] = ry;
        }
        else if(rangv[ry] < rangv[rx]){
            tata[ry] = rx;
        }
        else{
            tata[ry] = rx;
            rangv[rx]++;
        }
    }
};

int main(){
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);

    int N, M;
    cin >> N >> M;
    disset dsu(N);

    while(M--){
        int cod, x, y;
        cin >> cod >> x >> y;
        if(cod == 1){
            dsu.unite(x, y);
        }
        else{
            cout << (dsu.find(x) == dsu.find(y) ? "DA\n" : "NU\n");
        }
    }
}