Cod sursa(job #2986523)

Utilizator alexei_barosuAlexei Niculae alexei_barosu Data 28 februarie 2023 18:33:21
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <vector>
#include <stack>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("protest.in");
ofstream fout("protest.out");

int N,M,mult[100001],sz[100001];

int Find(int a)
{
    int root;
    root=a;
    while(mult[root]!=root)
        root=mult[root];
    while (mult[a]!=root)
    {
        int aux=mult[a];
        mult[a]=root;
        a=aux;
    }
    return root;
}

void Union(int a,int b)
{
    int root_a=Find(a);
    int root_b=Find(b);
    if (sz[root_a]<sz[root_b])
    {
        sz[root_b]=sz[root_a];
        mult[root_a]=root_b;
    }
    else
    {
        sz[root_a]=sz[root_b];
        mult[root_b]=root_a;
    }
}

int main()
{
    fin>>N>>M;
    for (int i=1; i<=N; i++)
    {
        mult[i]=i;
        sz[i]=1;
    }
    for (int i=1; i<=M; i++)
    {
        int cod,x,y;
        fin>>cod>>x>>y;
        if (cod==1)
        {
            Union(x,y);

        }
        else
        {
            Find(x);
            Find(y);
            if (mult[x]==mult[y])
                fout<<"DA"<<endl;
            else
                fout<<"NU"<<endl;
        }
    }
    return 0;
}