Cod sursa(job #2270304)

Utilizator AlexTudorAlex Brinza AlexTudor Data 27 octombrie 2018 10:26:29
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>
using namespace std;

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

int const nmax=100003;

int n,m;
int sz[nmax],mult[nmax];

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

void Union(int a, int b)
{
    int rootA=mult[a];
    int rootB=mult[b];

    if(sz[rootA]<sz[rootB])
    {
        sz[rootB]+=sz[rootA];
        mult[rootA]=rootB;
    }
    else
    {
        sz[rootA]+=sz[rootB];
        mult[rootB]=rootA;
    }
}

void solve()
{
    int i,cod,x1,x2,m1,m2;
    fin>>n>>m;
    for(i=1;i<=n;++i) {sz[i]=1; mult[i]=i;}

    for(i=1;i<=m;++i)
    {
        fin>>cod>>x1>>x2;
        if(cod==1)
            Union(x1,x2);
        else
        {
            m1=Find(x1);
            m2=Find(x2);
            if(m1==m2) fout<<"DA"<<"\n";
            else fout<<"NU"<<"\n";
        }
    }
}


int main()
{
    solve();
    return 0;
}