Cod sursa(job #3338710)

Utilizator Warrior.exeZgorcea Mihai-Alexandru Warrior.exe Data 4 februarie 2026 17:47:49
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.21 kb
#include <iostream>
#include <fstream>
using namespace std;

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

class padure{
    public:
        int *Parinte;
        int *Rang;
        int nr_elem;


        padure(int n){
            nr_elem = n;
            Parinte = new int [nr_elem+1];
            Rang    = new int [nr_elem+1];
            for(int i=0;i<=nr_elem;i++){
                Parinte[i] = i;
                Rang[i] = 1;
            }
        }


        void Union(int x,int y){
            int rx,ry;
            rx = find(x);
            ry = find(y);
            if(Rang[rx] > Rang[ry]){
                Parinte[ry] = rx;
                Rang[rx] += Rang[ry];
            }
            else{
                Parinte[rx] = ry;
                Rang[ry] += Rang[rx];
            }
        }


        int find(int x){
            int Varf=x,y;
            while(Parinte[Varf]!=Varf){
                Varf = Parinte[Varf];
            }
            while(Parinte[x]!=x){
                y = Parinte[x];
                Parinte[y] = Varf;
                x = y;
            }
            return x;
        }

        bool impreuna(int x,int y){
            return find(x) == find(y);
        }

        void afis_parinti(){
            cout<<"NR NOD : ";
            for(int i=1;i<=nr_elem;i++){
                cout<<i<<" ";
            }
            cout<<'\n';
            cout<<"PARINTE: ";
            for(int i=1;i<=nr_elem;i++){
                cout<<Parinte[i]<<" ";
            }
            cout<<'\n'<<'\n';
        }

        ~padure(){
            delete [] Parinte;
        }

};



void solve(){
    int nr_elem,nr_intrebari;
    fin>>nr_elem>>nr_intrebari;
    padure Padure(nr_elem);
    int tip,n1,n2;
    for(int i=1;i<=nr_intrebari;i++){
        fin>>tip>>n1>>n2;
        if(tip==1){
            Padure.Union(n1,n2);
            ///Padure.afis_parinti();
        }
        if(tip==2){
            if(Padure.impreuna(n1,n2)){
                fout<<"DA";
            }
            else{
                fout<<"NU";
            }
            fout<<'\n';
        }
    }

}

int main(){
    solve();
    return 0;
}