Cod sursa(job #2198143)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 23 aprilie 2018 18:50:40
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>
#define dimn 100000
#define mp std::make_pair

std::ifstream f("disjoint.in");
std::ofstream g("disjoint.out");

int N;
int root[dimn], rang[dimn];

int find(int x) {
    int y; y = x;
    while(root[y] != y) y = root[y];

    int aux;
    while(root[x] != x) {   //compresie
        aux = root[x];
        root[x] = y;
        x = aux;
    }

    return y;
}
void unite(int y, int x) {
    if(find(y) == find(x)) return;
    if(rang[x] > rang[y]) root[y] = x;
    else root[x] = y;

    if(rang[y] == rang[x]) rang[y]++;   //doar aici se modif inaltimea arborelui
}

void rezolvare() {
    f >> N;
    for (int i=0; i<N; i++)
        root[i+1] = i+1;

    int m; f >> m;
    for (int i=0, t, y, x; i<m; i++) {
        f >> t >> y >> x;
        if(t==1) unite(find(y), find(x));
        else g << (find(x) == find(y) ? "DA\n" : "NU\n");
    }
}

int main()
{
    rezolvare();

    return 0;
}