Cod sursa(job #2801980)

Utilizator oporanu.alexAlex Oporanu oporanu.alex Data 17 noiembrie 2021 12:02:50
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>

using namespace std;

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


const int nmax = 100005;

struct repRang{
    int rep;
    int rang;
};

int findRep(repRang* info, int x){
    if(x == info[x].rep)
        return x;
    return (info[x].rep = findRep(info, info[x].rep));
}
void reunion(repRang* info, int x, int y){
   int repX = findRep(info, x);
   int repY = findRep(info, y);
   if(info[repX].rang > info[repY].rang)
        info[repX].rep = repY;
   else
        if(info[repX].rang < info[repY].rang)
            info[repY].rep = repX;
        else
            {
                info[repX].rang++;
                info[repY].rep = repX;
            }
}

int main(){
    repRang* info = new repRang[nmax];

    int N, M;
    fin >> N >> M;
    for(int i = 1; i <= N; ++i)
        info[i].rep = i;

    for(int i = 1; i <= M; ++i){
        int cod, x, y;
        fin >> cod >> x >> y;
        if(cod == 2)
            if(findRep(info, x) == findRep(info, y))
                fout << "DA\n";
            else
                fout << "NU\n";
        else
            reunion(info, x, y);

    }
    return 0;
}