Cod sursa(job #2519799)

Utilizator richardbaczur1Baczur Richard richardbaczur1 Data 8 ianuarie 2020 14:06:08
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>
#define NMAX 100005
#define infile "disjoint.in"
#define outfile "disjoint.out"

using namespace std;
int n, m, c, x, y, T[NMAX], R[NMAX];

void init(int n)
{
    for (int i = 1; i <= n; i++)
    {
        T[i] = i;
        R[i] = 1;
    }
}

int root(int x)
{
    int r, y;

    for (r = x; T[r] != r; r = T[r]);

    while (T[x] != x)
    {
        y = T[x];
        T[y] = r;
        x = y;
    }
    return r;
}

void reunite(int x, int y)
{
    if (R[x] < R[y])
    {
        T[x] = T[y];
    }
    else
    {
        T[y] = x;
    }
    if (R[x] == R[y])
    {
        R[y]++;
    }
}

void pass(){return;}

int main()
{
    freopen(infile, "r", stdin);
    freopen(outfile, "w", stdout);

    scanf("%d %d", &n, &m);
    init(n);
    for (int i = 1; i <= m; i++)
    {
        scanf("%d %d %d", &c, &x, &y);
        if (c == 1)
        {
            reunite(root(x), root(y));
        }
        else
        {
            if (root(x) == root(y))
            {
                printf("DA\n");
            }
            else
            {
                printf("NU\n");
            }
        }
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}