Cod sursa(job #1607600)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 21 februarie 2016 14:05:09
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <cstdio>

using namespace std;

int tata[100005],h[100005];

int find1(int x)
{
    int r=x,y;

    while(r!=tata[r]) r=tata[r];

    while(x!=tata[x])
    {
        y=tata[x];
        tata[x]=r;
        x=y;
    }

    return x;
}

void union1(int a,int b)
{
    int x,y;

    x=find1(a);
    y=find1(b);

    if(h[x]<h[y]) tata[x]=y;
    else
    {
        tata[y]=x;
        if(h[x]==h[y]) h[x]++;
    }
}

int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);

    int n,m,i,a,b,k;

    scanf("%d%d",&n,&m);

    for(i=1;i<=n;i++) tata[i]=i;

    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&k,&a,&b);

        if(k==1) union1(a,b);
        else
        {
            if(find1(a)==find1(b)) printf("DA\n");
            else printf("NU\n");
        }
    }

    return 0;
}