Cod sursa(job #1375220)

Utilizator DenisacheDenis Ehorovici Denisache Data 5 martie 2015 12:38:22
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <cstdio>
#include <algorithm>
using namespace std;
int n,m,RG[100005],TT[100005];
int find(int x)
{
    int R,y;
    for (R=x;R!=TT[R];R=TT[R]);
    for (;x!=TT[x];x=TT[x])
    {
        y=TT[x];
        TT[x]=R;
        x=y;
    }
    return R;
}
void unite(int x,int y)
{
    if (RG[x]>RG[y]) TT[y]=x;
    else TT[x]=y;
    if (RG[x]==RG[y]) RG[y]++;
}
int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d %d",&n,&m);
    for (int i=1;i<=n;i++)
    {
        TT[i]=i;
        RG[i]=1;
    }
    int typeOp,x,y;
    while (m--)
    {
        scanf("%d %d %d",&typeOp,&x,&y);
        if (typeOp==1) unite(find(x),find(y));
        else
        {
            if (find(x)!=find(y)) printf("NU\n");
            else printf("DA\n");
        }
    }
    return 0;
}