Cod sursa(job #2953230)

Utilizator DenisacheDenis Ehorovici Denisache Data 10 decembrie 2022 18:19:55
Problema Paduri de multimi disjuncte Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

#define cin fin
#define cout fout

class DisjointSets
{
private:
    vector<size_t> sizeOfSet{0};
    vector<size_t> parent{0};

public:
    DisjointSets(const int &n)
    {
        sizeOfSet.resize(n, 1);
        parent.resize(n);

        for (int i = 0; i < n; i++)
        {
            parent[i] = i;
        }
    }

    int findSet(int x)
    {
        if (x == parent[x])
        {
            return x;
        }

        return parent[x] = findSet(parent[x]);
    }

    void unionSets(int a, int b)
    {
        a = findSet(a);
        b = findSet(b);

        if (a == b)
        {
            return;
        }

        if (sizeOfSet[a] > sizeOfSet[b])
        {
            swap(a, b);
        }

        parent[b] = a;
        sizeOfSet[a] += sizeOfSet[b];
    }
};

int main()
{
    ios::sync_with_stdio(false);

    int n, q;
    cin >> n >> q;

    DisjointSets ds(n);

    for (int i = 0; i < q; i++)
    {
        int queryType, a, b;
        cin >> queryType >> a >> b;

        if (queryType == 1)
        {
            ds.unionSets(a, b);
        }
        else if (ds.findSet(a) == ds.findSet(b))
        {
            cout << "DA\n";
        }
        else
        {
            cout << "NU\n";
        }
    }

    return 0;
}