Cod sursa(job #2859194)

Utilizator rares89_Dumitriu Rares rares89_ Data 28 februarie 2022 23:18:34
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");
 
int T[200005], rg[200005], n, M, x, y, c;
 
void Union(int a, int b) {
    if(rg[a] < rg[b]) {
        T[a] = T[b];
    } else {
        T[b] = T[a];
    }
    if(rg[a] == rg[b]) {
        rg[a]++;
    }
}
 
int Find(int nod) {
    int x = nod;
    while(x != T[x]) {
        x = T[x];
    }
    while(nod != T[nod]) {
        int temp = T[nod];
        T[nod] = x;
        nod = temp;
    }
    return nod;
}
 
int main() {
    for(int i = 1; i <= 200000; i++) {
        T[i] = i;
        rg[i] = 1;
    }
    fin >> n >> M;
    for(int i = 1; i <= M; i++) {
        fin >> c >> x >> y;
        if(c == 1) {
            int nod1 = Find(x), nod2 = Find(y);
            if(nod1 != nod2) {
                Union(nod1, nod2);
            }
        } else {
            fout << (Find(x) == Find(y) ? "DA\n" : "NU\n");
        }
    }
    fin.close();
    fout.close();
    return 0;
}