Cod sursa(job #2477783)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 21 octombrie 2019 09:01:23
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

const int NMAX = 1e5 + 5;

int N, M, Type, X, Y;

int T[NMAX], Ap[NMAX];

static inline int Find (int Node)
{
    if(Node == T[Node])
        return Node;

    return T[Node] = Find(T[Node]);
}

static inline void Unify (int X, int Y)
{
    X = Find(X);
    Y = Find(Y);

    if(X == Y)
        return;

    if(Ap[X] > Ap[Y])
    {
        Ap[X] += Ap[Y];
        Ap[Y] = 0;

        T[Y] = X;

        return;
    }

    Ap[Y] += Ap[X];
    Ap[X] = 0;

    T[X] = Y;

    return;
}

static inline void Initialize (int N)
{
    for(int i = 1; i <= N; ++i)
        T[i] = i, Ap[i] = 1;

    return;
}

static inline void Solve ()
{
    f.tie(NULL);

    f >> N >> M;

    Initialize(N);

    for(int i = 1; i <= M; ++i)
    {
        f >> Type >> X >> Y;

        if(Type == 1)
            Unify(X, Y);
        else
        {
            if(Find(X) == Find(Y))
                g << "DA";
            else g << "NU";

            g << '\n';
        }
    }

    return;
}

int main()
{
    Solve();

    return 0;
}