Cod sursa(job #2455789)

Utilizator OctavianVasileVasileOctavian OctavianVasile Data 12 septembrie 2019 18:56:32
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("disjoint.in");
ofstream fout ("disjoint.out");
#define NMAX 100003
int cod [NMAX], lg [NMAX];
int n, m;
int FindRoot (int A){
    int B;
    for (B = A; cod [B] != B; B = cod [B]);
    while (cod[A] != A){
        int cpy = cod [A];
        cod [A] = B;
        A = cpy;
    }
    return B;
}
void Reu (int x, int y){
    if (lg [x] > lg [y]){
        cod [y] = x;
        lg [x] += lg [y];
        lg [y] = lg [x];
    }
    else{
        cod [x] = y;
        lg [y] += lg [x];
        lg [x] = lg [y];
    }
}
int main (){
    fin >> n >> m;
    for (int B = 1; B <= n; B ++){
        cod [B] = B;
        lg [B] = 1;
    }
    for (int B = 1; B <= m; B ++){
        int cod, x, y;
        fin >> cod >> x >> y;
        if (cod == 1)
            Reu (FindRoot (x), FindRoot (y));
        else{
            if (FindRoot (x) == FindRoot (y))fout << "DA" << '\n';
            else fout << "NU" << '\n';
        }
    }
    return 0;
}