Cod sursa(job #2845138)

Utilizator AlexNicuNicu Alexandru AlexNicu Data 7 februarie 2022 15:59:59
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>

using namespace std;

ifstream cin ( "disjoint.in" );
ofstream cout ( "disjoint.out" );

#define NMAX 100000

int parent[NMAX + 1], inaltime[NMAX + 1];

int find(int x) {
    if ( parent[x] == x )
        return x;
    parent[x] = find(parent[x]);
    return parent[x];
}

void merge( int x, int y ) {
    int multX, multY;
    multX = find(x);
    multY = find(y);
    if ( multX != multY ) {
        if ( inaltime[x] < inaltime[y] ) {
            parent[multX] = multY;
        }
        else if ( inaltime[y] < inaltime[x] ) {
            parent[multY] = multX;
        }
        else {
            parent[multX] = multY;
            inaltime[multY]++;
        }
    }
}

int main() {
    int n, m, tip, x, y, i;
    cin >> n >> m;
    for ( i = 0; i < n; i++ ) {
        parent[i] = i;
        inaltime[i] = 1;
    }
    for ( i = 0; i < m; i++ ) {
        cin >> tip >> x >> y;
        if ( tip == 1 ) {
            merge(x, y);
        }
        else {
            cout << ( find(x) == find(y) ? "DA\n" : "NU\n" );
        }
    }
    return 0;
}