Cod sursa(job #3308946)

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

using namespace std;
ifstream cin("disjoint.in");
ofstream cout("disjoint.out");
int rad[100001],card[100001],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){
            Unire(w,z);
        }
        else{
            Gasire(w);
            Gasire(z);
            if(Gasire(w)==Gasire(z))
                cout<<"DA";
            else
                cout<<"NU";
            cout<<'\n';
        }
    }
    return 0;
}