Cod sursa(job #1111750)

Utilizator a96tudorAvram Tudor a96tudor Data 19 februarie 2014 08:50:49
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include<cstdio>
#define N_MAX 100010
using namespace std;
int T[N_MAX],rang[N_MAX],N,M;
inline void Reuneste(int x,int y)
{
    if (rang[x]<rang[y]) T[x]=T[y];
                else T[y]=T[x];
    if (rang[x]==rang[y]) rang[x]++;
}
inline int tata(int x)
{
    if (x!=T[x]) return tata(T[x]);
    return T[x];
}
int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d%d",&N,&M);
    for (int i=1;i<=N;++i) {T[i]=i; rang[i]=0;}
    for (int i=1;i<=M;++i)
    {
        int k,x,y,Tx,Ty;
        scanf("%d%d%d",&k,&x,&y);
        Tx=tata(x); Ty=tata(y);
        if (k==1) Reuneste(Tx,Ty);
            else {
                    if (Tx!=Ty) printf("NU\n");
                            else printf("DA\n");
                 }
    }
    fclose(stdin); fclose(stdout);
    return 0;
}