Cod sursa(job #1453909)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 24 iunie 2015 23:51:30
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>

using namespace std;
#define Nmax 100005
#define DIM 3666013

char buffer[DIM];
int poz = DIM - 1;

void Read(int &A)
{
    A = 0;
    while('0' > buffer[poz] || buffer[poz] > '9')
        if(++poz == DIM)
            fread(buffer,1,DIM,stdin),poz = 0;
    while('0' <= buffer[poz] && buffer[poz] <= '9')
    {
        A = A*10 + buffer[poz] - 48;
        if(++poz == DIM)
            fread(buffer,1,DIM,stdin),poz = 0;
    }
}

int N,K;
int daddy[Nmax],Rank[Nmax];


void precomp()
{
    for(int i = 1; i <= N; ++i){
        daddy[i] = i;
    }
}

int whos_ur_daddy(int k){
    if(daddy[k] != k)
        daddy[k] = whos_ur_daddy(daddy[k]);
    return daddy[k];
}

void couple(int a,int b){
    if(Rank[a] < Rank[b])
        daddy[a] = b;
    else
        daddy[b] = a;

    if(Rank[a] == Rank[b])
        ++Rank[a];
}

void Read()
{
    ///Read(N);Read(K);
    scanf("%d%d",&N,&K);
    precomp();
    int a,b,t;
    for(int i = 1; i <= K; ++i){
        ///Read(t);Read(a);Read(b);
        scanf("%d%d%d",&t,&a,&b);
        if(t == 1)
            couple(whos_ur_daddy(a),whos_ur_daddy(b));
        else{
            if(whos_ur_daddy(a) == whos_ur_daddy(b))
                printf("DA\n");
            else
                printf("NU\n");
        }
    }
}

int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);

    Read();

    return 0;
}