Cod sursa(job #2807112)

Utilizator icnsrNicula Ionut icnsr Data 23 noiembrie 2021 13:46:07
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <vector>
#include <numeric>

int main()
{
        std::freopen("disjoint.in", "r", stdin);
        std::freopen("disjoint.out", "w", stdout);

        std::ios_base::sync_with_stdio(false);
        std::cin.tie(nullptr);

        int N, M;
        std::cin >> N >> M;

        std::vector<int> link(N + 1);
        std::iota(link.begin(), link.end(), 0);

        std::vector<int> size(N + 1, 1);

        const auto find_set = [&](int x)
        {
                while(x != link[x])
                {
                        x = link[x];
                }

                return x;
        };

        const auto unite = [&](int a, int b)
        {
                a = find_set(a);
                b = find_set(b);

                if(size[a] < size[b])
                {
                        std::swap(a, b);
                }

                size[a] += size[b];
                link[b] = a;
        };

        for(int i = 0; i < M; ++i)
        {
                static constexpr const char* ans[2] = {"NU\n", "DA\n"};

                int op, x, y;
                std::cin >> op >> x >> y;

                switch(op)
                {
                case 1:
                {
                        unite(x, y);
                        break;
                }
                case 2:
                {
                        std::cout << ans[find_set(x) == find_set(y)];
                        break;
                }
                default:
                        __builtin_unreachable();
                }
        }
}