Cod sursa(job #897908)

Utilizator Athena99Anghel Anca Athena99 Data 27 februarie 2013 22:53:22
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <cstdio>
#include <cassert>

const int nmax=100005;
int v[nmax];

int up(int a,int b)
{
    if (v[a]!=v[v[a]])
        v[a]=up(v[a],b);
    else if (b)
         v[a]=b;
    return v[a];
}

int main()
{
    int n=0,m=0,i=0,c=0,x=0,y=0;

    assert(freopen("disjoint.in","r",stdin));
    assert(freopen("disjoint.out","w",stdout));

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

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

    for (i=0; i<m; ++i)
    {
        assert(scanf("%d%d%d",&c,&x,&y));

        if (v[x]!=v[v[x]])
            v[x]=up(x,0);
        if (v[y]!=v[v[y]])
            v[y]=up(y,0);

        if (c==1 && v[x]!=v[y])
            v[y]=up(v[y],v[x]);
        else if (c==2 && v[x]==v[y])
            assert(printf("DA\n"));
        else if (c==2 && v[x]!=v[y])
            assert(printf("NU\n"));
    }

    return 0;
}