Cod sursa(job #3333015)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 10 ianuarie 2026 14:53:28
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>

using namespace std;

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

const int Nmax = 100005;

struct element{
    int radacina, marime;

    void initializare(int al_catelea){
        radacina = al_catelea;
        marime = 1;
    }
};

int n, q;
element dsu[Nmax];

void citire(){
    fin >> n >> q;
}

void preinitializare(){
    for(int i = 1; i <= n; i++){
        dsu[i].initializare(i);
    }
}

int actualizare_radacina(int x){
    if(dsu[x].radacina == x){
        return x;
    }

    int radacina = actualizare_radacina(dsu[x].radacina);
    dsu[x].radacina = radacina;
    return radacina;
}

void unire(int x, int y){
    int r_x, r_y;

    r_x = actualizare_radacina(x);
    r_y = actualizare_radacina(y);

    if(r_x == r_y){
        return;
    }

    if(dsu[r_x].marime > dsu[r_y].marime){
        swap(r_x, r_y);
    }

    dsu[r_x].radacina = r_y;
    dsu[r_y].marime += dsu[r_x].marime;
}

bool sunt_in_aceeasi_multime(int x, int y){
    return actualizare_radacina(x) == actualizare_radacina(y);
}

void citire_si_rezolvare_interogari(){
    int tip, x, y;

    for(int i = 1; i <= q; i++){
        fin >> tip >> x >> y;

        if(tip == 1){
            unire(x, y);
        }
        else{
            if(sunt_in_aceeasi_multime(x, y)){
                fout << "DA\n";
            }
            else{
                fout << "NU\n";
            }
        }
    }
}

int main(){
    citire();
    preinitializare();
    citire_si_rezolvare_interogari();

    return 0;
}