Cod sursa(job #2935031)

Utilizator Katherine456719Swan Katherine Katherine456719 Data 6 noiembrie 2022 12:27:46
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;


//Complexitate: O(log*N) pentru o operatie de tipul 2 si O(1) pentru o operatie de tipul 1.


vector<int> parinte, inaltime;

int radacina(int node){
    int start = node;
    while(parinte[node] != 0){
        node = parinte[node];
    }
    while(start != node){
        int urm = parinte[start];
        parinte[start] = node;
        start = urm;
    }
    return node;
}

void uneste(int nodx, int nody){
    int parintex = radacina(nodx), parintey = radacina(nody);
    if(parintex == parintey)
        return;
    if(inaltime[parintex] > inaltime[parintey]){
        parinte[parintey] = parintex;
    }
    else if(inaltime[parintex] < inaltime[parintey]) {
        parinte[parintex] = parintey;
    }
    else {
        parinte[parintey] = parintex;
        inaltime[parintex] ++;
    }
}

int main(){
    ifstream fin("disjoint.in");
    ofstream fout("disjoint.out");

    ios::sync_with_stdio(false);
    fin.tie(nullptr);
    fout.tie(nullptr);

    int n, m;
    fin >> n >> m;
    parinte.resize(n+2,0);
    inaltime.resize(n+2,0);

    for(int i = 1; i <= m; ++i) {
        int op, x, y;
        fin >> op >> x >> y;
        if(op == 1)
            uneste(x,y);
        else {
            int parintex = radacina(x), parintey = radacina(y);
            if (parintex == parintey)
                fout<<"DA\n";
            else fout<<"NU\n";
        }
    }
    return 0;
}