Cod sursa(job #3138682)

Utilizator MihneaStoicaMihnea Teodor Stoica MihneaStoica Data 21 iunie 2023 12:01:12
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <unordered_map>
#include <vector>

using namespace std;

ifstream cin ("disjoint.in");
ofstream cout ("disjoint.out");

struct DSU
{
    unordered_map<int, int> parent, sizes;

    void init(int st, int dr)
    {
        for (int i = st; i < dr; i ++)
        {
            parent[i] = i;
            sizes[i] = 1;
        }
    }

    int find_parent (int u)
    {
        if (u == parent[u])
        {
            return u;
        }
        return parent[u] = find_parent(parent[u]);
    }

    void unite(int u, int v)
    {
        u = find_parent(u);
        v = find_parent(v);
        if (u == v) return;
        if (sizes[v] > sizes[u])
        {
            swap(v, u);
        }
        parent[v] = u;
        sizes[u] += sizes[v];
    }
};

DSU dsu;

int main()
{
    int n, m; cin >> n >> m;
    dsu.init(1, n + 1);
    for (int i = 1; i <= m; i ++)
    {
        int x, a, b; cin >> x >> a >> b;
        switch (x)
        {
        case 1:
            dsu.unite(a, b);
            break;
        case 2:
            cout << (dsu.find_parent(a) == dsu.find_parent(b) ? "DA" : "NU") << '\n';
            break;
        }
    }
}