Cod sursa(job #3308947)

Utilizator Mate_3.14_9.8_infoRaducanu Mario-Ionut Mate_3.14_9.8_info Data 30 august 2025 12:35:26
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include<fstream>

using namespace std;
ifstream cin("disjoint.in");
ofstream cout("disjoint.out");
int rad[100003],card[100003],c,w,z,n,q;
//prima optimizare, se uneste multimea mai mica la multimea mai mare
//se uneste multimea cu radacina in a cu cea care are radacina in b;
void Unire(int a, int b){
    if(card[b]>card[a]){
        swap(a,b);
    }
    rad[b]=a;
    card[a]+=card[b];
}
//gasim radacina unei multimi
int Gasire(int x){
    if(rad[x]==x)
        return x;
    // se reactualizeaza radacina elementelor, o alta optimizare
    rad[x]=Gasire(rad[x]);
    return rad[x];
}
int main()
{
    cin>>n>>q;
    //initializare multimi,fiecare element face parte din propria multime ceea ce duce la cardinal de multime 1
    for(int i=1;i<=n;i++){
        rad[i]=i;
        card[i]=1;
    }
    for(int i=1;i<=q;i++){
        cin>>c>>w>>z;
        if(c==1){
            if(Gasire(w)!=Gasire(z))
                Unire(Gasire(w),Gasire(z));
        }
        else{
            if(Gasire(w)==Gasire(z))
                cout<<"DA";
            else
                cout<<"NU";
            cout<<'\n';
        }
    }
    return 0;
}