Cod sursa(job #2854375)

Utilizator Casian_doispeChiriac Casian Casian_doispe Data 21 februarie 2022 12:15:22
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <deque>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <cmath>
#include <climits>

#define MOD 104659

using namespace std ;

ifstream cin ("disjoint.in") ;
ofstream cout ("disjoint.out") ;

int n, tatal[100009], nivele[100009] ;

int auxglob ;

int tatal_suprem(int nod) /// cat timp faci cauti tatal suprem mai si aplatizezi arborele
{
    if(tatal[nod] == 0)
    {
        auxglob = nod ;

        return nod ;
    }
    int rez ;

    rez = tatal_suprem(tatal[nod]) ;

    tatal[nod] = auxglob ;

    return rez ;
}

void merg(int a, int b)
{
    /// trebe sa vedem care dintre multimiile a si b are mai multe nivele

    int tsa = tatal_suprem(a), tsb = tatal_suprem(b) ;

    if(nivele[tsa] > nivele[tsb])
    {
        tatal[tsb] = tsa ;
    }
    else if(nivele[tsb] > nivele[tsa])
    {
        tatal[tsa] = tsb ;
    }
    else /// sunt egale nivelele
    {
        tatal[tsa] = tsb ;

        nivele[tsa] ++ ;
    }
}

int main()
{
    int q ;

    cin >> n >> q ;

    while(q --)
    {
        int a, b, c ;

        cin >> a >> b >> c ;

        if(a == 1) /// sa se dea merge la multimile care il contin pe c si pe b
        {
            merg(b, c) ;
        }
        if(a == 2) /// DA/NU daca sunt b si c in aceeasi mulitme
        {
            if(tatal_suprem(b) == tatal_suprem(c))cout << "DA" << '\n' ;
                else cout << "NU" << '\n' ;
        }
    }

    return 0 ;
}
/*



*/