Cod sursa(job #2616852)

Utilizator KPP17Popescu Paul KPP17 Data 20 mai 2020 07:45:55
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#define submit
#ifdef submit
    #define fisier "apm"
#else
    #define fisier "ULTRA"
#endif

#include <fstream>
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");



template <int N> struct NR {enum {NODURI = N + NR<(N>>1)+(N&1)>::NODURI};};
template <> struct NR<1> {enum {NODURI = 1};};

const int
N = 100000,
M = 100000,
NODURI = NR<N>::NODURI;

struct {int sus = -1, jos = -1;} noduri[NODURI];
int n, m;

int radacina(int nod, int& nivel)
{nivel = 0; while (noduri[nod].sus != -1) nod = noduri[nod].sus, nivel++; return nod;}

int radacina(int nod)
{while (noduri[nod].sus != -1) nod = noduri[nod].sus; return nod;}



int main()
{
    in >> n >> m;

    int noua_radacina = n;

    while (m--)
    {
        int op, x, y;
        in >> op >> x >> y;
        x--; y--;

        if (op == 1)
        {
            int
            nivel_x,
            nivel_y,
            sus_x = radacina(x, nivel_x),
            sus_y = radacina(y, nivel_y);

            if (nivel_x == nivel_y)
            {
                noduri[sus_x].sus = noua_radacina;
                noduri[sus_y].sus = noua_radacina;
                noduri[noua_radacina++].jos = sus_x;
            }
            if (nivel_x < nivel_y)
            {
                noduri[sus_x].sus = sus_y;
            }
            if (nivel_x > nivel_y)
            {
                noduri[sus_y].sus = sus_x;
            }
        }
        else
        {
            out << (radacina(x) == radacina(y)? "DA": "NU") << "\n";
        }
    }
}