Cod sursa(job #3252628)

Utilizator uncle_sam_007ioan bulik uncle_sam_007 Data 30 octombrie 2024 12:55:48
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>

using namespace std;

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

const int NMAX = 1e5 + 5;

int h[NMAX], t[NMAX];

void UnionSet(int x, int y){
    if(h[x] > h[y]){
        t[y] = x;
    }
    else{
        if(h[y] > h[x]){
            t[x] = y;
        }
        else{
            if(h[x] == h[y]){
                t[y] = x;
                h[x] ++;
            }
        }
    }
}

int FindRoot(int x){
    while(x != t[x]){
        x = t[x];
    }
    return x;
}


void solve(){
    int tip, x, y, m, n;
    fin >> n;
    for(int i = 1; i <= n; ++i){
        t[i] = i;
        h[i] = 1;
    }
    fin >> m;
    for(int i = 1; i <= m; ++i){
        fin >> tip >> x >> y;
        if(tip == 1){
            UnionSet(x, y);
        }
        else{
            if(FindRoot(x) == FindRoot(y)){
                fout << "DA";
            }
            else{
                fout << "NU";
            }
            fout << "\n";
        }
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(NULL);

    solve();

    fin.close();
    fout.close();
    return 0;
}