Cod sursa(job #2650506)

Utilizator KPP17Popescu Paul KPP17 Data 19 septembrie 2020 09:13:36
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb

#define fisier "disjoint"


#ifdef fisier
    #include <fstream>
    std::ifstream in(fisier ".in");
    std::ofstream out(fisier ".out");
#else
    #include <iostream>
    #define in std::cin
    #define out std::cout
#endif



const int
N = 100000,
M = N;

int n;

#include <vector>

struct Set
{
    int* graf;

    Set(int alocare): graf(new int[alocare]()) {} // () dupa alocare dinamica cu "new" initializeaza elementele cu null.
    ~Set() {delete[] graf;}

    inline int get(int element) // O(1)
    {
        return element;
    }

    int radacina(int element) // O(log(n)) / O(1)
    {
        std::vector<int> drum;
        int rad = get(element);
        while (graf[rad])              //
        {                              //
            drum.push_back(rad);     //
            rad = graf[rad] - 1;     //
        }                           //  Aici fac compresia drumului.
        for (int varf: drum)       //
        {                          //
            graf[varf] = rad + 1; //
        }                        //
        return rad;
    }

    inline void uneste(int a, int b) // O(log(n))
    {
        graf[radacina(a)] = radacina(b) + 1;
    }
};



int main()
{
    int m;
    in >> n >> m;
    Set set = n;

    while (m--)
    {
        int op, a, b;
        in >> op >> a >> b;
        a--, b--;

        if (op & 1)
            set.uneste(a, b);
        else
            out << (set.radacina(a) == set.radacina(b)? "DA": "NU") << '\n';
    }
}