Cod sursa(job #3329741)

Utilizator coco11coraline kalbfleisch coco11 Data 15 decembrie 2025 14:11:22
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <bits/stdc++.h>
using namespace std;

#define int long long

const int MAXN = 100000+5;

int parent[MAXN], rnk[MAXN];

int find_set(int v){
    if(parent[v]==v) return v;
    parent[v] = find_set(parent[v]); // path compression
    return parent[v];
}

void union_set(int a,int b){
    a = find_set(a);
    b = find_set(b);
    if(a!=b){
        if(rnk[a]<rnk[b]) swap(a,b);
        parent[b]=a;
        if(rnk[a]==rnk[b]) rnk[a]++;
    }
}

signed main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);

    int N,M; cin>>N>>M;
    for(int i=1;i<=N;i++){
        parent[i]=i;
        rnk[i]=0;
    }

    for(int i=0;i<M;i++){
        int cod,x,y; cin>>cod>>x>>y;
        if(cod==1){
            union_set(x,y);
        }else{
            if(find_set(x)==find_set(y)) cout<<"DA\n";
            else cout<<"NU\n";
        }
    }
    return 0;
}