Cod sursa(job #1144435)

Utilizator OnimushaLordTiberiu Copaciu OnimushaLord Data 17 martie 2014 08:57:26
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
# include <cstdio>
# define N 100010

using namespace std;

int i,n,m,op,x,y;
int T[N],R[N];

int find(int x)
{
    int R,aux;
    for(R=x; R!=T[R]; R=T[R]);
    while(T[x]!=x)
    {
        aux=T[x];
        T[x]=R;
        x=aux;
    }
    return R;
}
void reuneste(int x, int y)
{
    if(R[x]>R[y]) T[y]=x;
    else T[x]=y;
    if(R[x]==R[y]) R[x]++;
}
int main()
{
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
    scanf("%d %d\n", &n, &m);
    for(i=1; i<=n; ++i)
    {
        T[i]=i;
        R[i]=1;
    }
    for(; m; --m)
    {
        scanf("%d %d %d\n", &op, &x, &y);
        if(op==1) reuneste(find(x),find(y));
        else if(find(x)==find(y)) printf("DA\n");
        else printf("NU\n");
    }
}