Cod sursa(job #2650400)

Utilizator KPP17Popescu Paul KPP17 Data 18 septembrie 2020 17:14:25
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 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 Varf {Varf* tata;};

struct Set
{
    Varf* graf;

    Set(int alocare) {graf = new Varf[alocare]();}
    ~Set() {delete[] graf;}

    inline Varf* get(int element)
    {
        return graf + element;
    }

    Varf* radacina(int element)
    {
        std::vector<Varf*> drum;
        Varf* rad = get(element);
        while (rad->tata)
        {
            drum.push_back(rad);
            rad = rad->tata;
        }
        for (Varf* varf: drum)
        {
            varf->tata = rad;
        }
        return rad;
    }

    void uneste(int a, int b)
    {
        radacina(a)->tata = radacina(b);
    }
};



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';
    }

}