Cod sursa(job #2693761)

Utilizator MevasAlexandru Vasilescu Mevas Data 6 ianuarie 2021 22:16:02
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include<fstream>

#define Nmax 100010

using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

int n, m;

int reps[Nmax];
int sizes[Nmax];

int findRep(int x) {
    if(x != reps[x])
        reps[x] = findRep(reps[x]);
    return reps[x];
}

void unite(int x, int y) {
    int smaller = findRep(x);
    int larger = findRep(y);

    if(smaller == larger) {
        return;
    }

    if(sizes[smaller] > sizes[larger]) {
        swap(smaller, larger);
    }

    reps[smaller] = larger;
    sizes[larger] += sizes[smaller];
}

int main() {
    fin >> n >> m;

    for(int i = 1; i <= n; i++) {
        reps[i] = i;
        sizes[i] = 1;
    }

    for(int i = 0; i < m; i++) {
        int op, x, y;
        fin >> op >> x >> y;
        switch(op) {
            case 1:
                unite(x, y);
                break;
            case 2:
                if(findRep(x) == findRep(y)) {
                    fout << "DA";
                } else {
                    fout << "NU";
                }
                fout << endl;
                break;
        }
    }
}