Cod sursa(job #1233893)

Utilizator armandpredaPreda Armand armandpreda Data 26 septembrie 2014 11:42:48
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <cstdio>

using namespace std;

const int LIM=100005;
int n,p,tata[LIM],rang[LIM];

int find_tata(int k)
{
    if(k==tata[k])
        return k;
    int t=find_tata(tata[k]);
    tata[k]=t;
    return t;
}
void reuniune(int a,int b)
{
    int ta=find_tata(a),tb=find_tata(b);
    if(rang[ta]<rang[tb])
        rang[tb]+=rang[ta],tata[ta]=tb;
    else
        rang[ta]+=rang[tb],tata[tb]=ta;
}
bool same_set(int a,int b)
{
    return find_tata(a)==find_tata(b);
}
int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    int i,op,a,b;
    scanf("%d%d",&n,&p);
    for(i=1;i<=n;++i)
        tata[i]=i,rang[i]=1;
    for(;p;--p)
    {
        scanf("%d%d%d",&op,&a,&b);
        if(op==1)
            reuniune(a,b);
        else
            if(same_set(a,b))
                printf("DA\n");
            else
                printf("NU\n");
    }
    return 0;
}