Cod sursa(job #1634783)

Utilizator japjappedulapPotra Vlad japjappedulap Data 6 martie 2016 14:29:10
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
using namespace std;

ifstream is ("disjoint.in");
ofstream os ("disjoint.out");

const int Nmax = 100001;

int N, Q;
int T[Nmax], Sz[Nmax];

int Root(int x);
void Join(int a, int b);

int main()
{
    is >> N >> Q;
    for (int i = 1; i <= N; ++i)
        T[i] = i, Sz[i] = 1;

    for (int i = 1, op, a , b; i <= Q; ++i)
    {
        is >> op >> a >> b;
        if (op == 1)
            Join(a, b);

        else
            if (Root(a) == Root(b))
                os << "DA\n";
            else
                os << "NU\n";
    }


    is.close();
    os.close();
}

int Root(int x) //find root and compress tree
{
    int R;
    for (R = x; R != T[R]; R = T[R]);
    for (int aux; x != T[x]; aux = T[x], T[x] = R, x = aux);
    return R;
}

void Join(int a, int b)
{
    int Ra = Root(a);
    int Rb = Root(b);
    if (Sz[Ra] > Sz[Rb]) T[Rb] = Ra;
        else T[Ra] = Rb;
    if (Sz[Ra] == Sz[Rb])
        Sz[Rb]++;
}