Cod sursa(job #3258754)

Utilizator Speezy3k2.0jianu dorin Speezy3k2.0 Data 23 noiembrie 2024 15:41:14
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>

using namespace std;

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

const int NMAX = 2e5;

struct DSU
{
    int rep[NMAX];
    int size[NMAX];
    DSU(int n)
    {
        for(int i = 1 ; i <= n ; i++)
        {
            rep[i] = i;
            size[i] = 1;
        }
    }

    int get_rep(int x)
    {
        if(x == rep[x])
            return x;
        else return get_rep(rep[x]);
    }

    bool check(int a , int b)
    {
        if(get_rep(a) == get_rep(b))
            return true;
        else return false;
    }

    void join(int a , int b)
    {
        int ra = get_rep(a);
        int rb = get_rep(b);
        if(size[ra] > size[rb])
        {
            size[ra] += size[rb];
            rep[rb] = ra;
        }
        else
        {
            size[rb] += size[ra];
            rep[ra] = rb;
        }
    }

};

int n , m;

int main(int argc , char **argv)
{
    cin.tie(NULL);
    std::ios_base::sync_with_stdio(0);
    cin >> n >> m;
    DSU dsu(n);
    int a , b , c;
    for(int i = 1 ; i <= m ; i++)
    {
        cin >> a >> b >> c;
        if(a == 1)
            dsu.join(b , c);
        else if(a == 2)
        {
            if(dsu.check(b , c))
                cout << "DA" << "\n";
            else cout << "NU" << "\n";
        }
    }
    return 0;
}