Cod sursa(job #1392550)

Utilizator andru47Stefanescu Andru andru47 Data 18 martie 2015 18:42:13
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <cstdio>
using namespace std;
int t[100010],rang[100010];
int findd(int x)
{
    int r=x;
    for (; r != t[r]; r = t[r]);

    while (t[x] != x)
    {
        int cx = t[x];
        t[x] = r;
        x = cx;
    }
    return r;
}
inline void uneste(int x,int y)
{
    if (rang[x]>rang[y])t[y]=x;
    else if (rang[x]<rang[y])t[x]=y;
    else
    {
        rang[x]++;
        t[y]=x;
    }
}
int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    int n, que;
    scanf("%d %d",&n,&que);
    for (int i=1; i<=n; i++)
    {
        t[i]=i;
        rang[i]=1;
    }
    for (int i=1; i<=que; i++)
    {
        int instr, x, y;
        scanf("%d %d %d",&instr,&x,&y);
        if (instr==1) uneste(findd(x),findd(y));
        else if (findd(x)==findd(y))printf("DA\n");
        else printf("NU\n");
    }
    return 0;
}