Cod sursa(job #2460857)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 24 septembrie 2019 16:49:08
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

const int MV = 1e5 ;

FILE *in = fopen("disjoint.in", "r"), *out = fopen("disjoint.out", "w") ;

int n, m ;

int tata[MV + 5] ;
int rg[MV + 5] ;

void uneste(int x, int y) {
        if (rg[x] > rg[y]) {
                tata[y] = x ;
        } else  tata[x] = y ;
        rg[x] += (rg[x] == rg[y]) ;
}

int Find(int x) {
        int rez(x), aux ;
        for ( ; tata[rez] != rez ; rez = tata[rez]) ;
        while (tata[x] != x) {
                aux = tata[x] ;
                tata[aux] = rez ;
                x = aux ;
        }
        return rez ;
}

int main() {
        fscanf(in, "%d %d", &n, &m) ;
        int i, x, y, cod ;
        for (i = 1 ; i <= n ; ++ i) {
                rg[i] = 1 ;
                tata[i] = i ;
        }
        for (i = 1 ; i <= m ; ++ i) {
                fscanf(in, "%d %d %d", &cod, &x, &y) ;
                if (cod == 1) {
                        uneste(Find(x), Find(y)) ;
                } else {
                        if (Find(x) != Find(y)) {
                                fprintf(out, "NU\n") ;
                        } else  fprintf(out, "DA\n") ;
                }
        }
}