Cod sursa(job #1453902)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 24 iunie 2015 23:40:48
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 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;
vector<int> L[Nmax];
int Place[Nmax];

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

void Merge(int a,int b)
{
    while(L[b].size()){
        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(L[v1].size() < L[v2].size())
        Merge(v2,v1);
    else
        Merge(v1,v2);
}

void Read()
{
    Read(N);Read(K);
    precomp();
    int a,b,t;
    for(int i = 1; i <= K; ++i){
        Read(t);Read(a);Read(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;
}