Cod sursa(job #1453900)

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

using namespace std;
#define Nmax 100005

int N,K;
vector<int> L[Nmax];
int Size[Nmax],Place[Nmax];

void precomp()
{
    for(int i = 1; i <= N; ++i){
        L[i].push_back(i);
        Size[i] = 1;
        Place[i] = i;
    }
}

void Merge(int a,int b)
{
    while(Size[b]--){
        L[a].push_back(L[b].back());
        Place[L[b].back()] = a;
        L[b].pop_back();
    }
    L[b].clear();
    L[b].shrink_to_fit();
}

void Union(int v1,int v2)
{
    if(Size[v1] < Size[v2])
        Merge(v2,v1);
    else
        Merge(v1,v2);
}

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

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

    Read();

    return 0;
}