Cod sursa(job #2467621)

Utilizator richardbaczur1Baczur Richard richardbaczur1 Data 4 octombrie 2019 18:32:22
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>
#define inFile "disjoint.in"
#define outFile "disjoint.out"
#define NMAX 100005

using namespace std;
unsigned int T[NMAX],R[NMAX],n,m,x,y,c;

inline void preset(int n);
inline int cauta(int x);
inline void reunite(int x, int y);

int main()
{
    freopen(inFile, "r", stdin);
    freopen(outFile, "w", stdout);

    scanf("%d %d", &n, &m);
    preset(n);
    for (int i=0;i<m;++i)
    {
        scanf("%d %d %d", &c, &x, &y);
        if (c==1)
        {
            reunite(x,y);
        }
        else
        {
            if (cauta(x)==cauta(y)) printf("DA \n");
            else printf("NU \n");
        }
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}

inline void preset(int n)
{
    for (int i=1;i<=n;++i)
    {
        T[i]=i;
        R[i]=1;
    }
}

inline int cauta(int x)
{
    int r=x,y;
    while(T[r]!=r)
    {
        r=T[r];
    }
    while (T[x]!=x)
    {
        y = T[x];
        T[x]=r;
        x=y;
    }
    return r;
}

inline void reunite(int x, int y)
{
    if (R[x]<R[y])
    {
        T[y]=x;
    }
    else if (R[x]>R[y])
    {
        T[x]=y;
    }
    else
    {
        R[y]++;
        T[x]=y;
    }
}