Cod sursa(job #1946879)

Utilizator Andreiii500Andrei Puiu Andreiii500 Data 30 martie 2017 16:07:13
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<iostream>
#include<fstream>
using namespace std;

ifstream in("disjoint.in");
ofstream out("disjoint.out");

const int N = 100001;

int boss[N],n,m;

void update(int a, int b)
{
    int stiva[N], cnt=0;
    while(a != boss[a])
    {
        stiva[++cnt] = a;
        a = boss[a];
    }
    while(b != boss[b])
    {
        stiva[++cnt] = b;
        b = boss[b];
    }

    for(int i=1; i<=cnt; ++i) boss[stiva[i]] = boss[b];

    boss[a] = boss[b];
}

void query(int a, int b)
{
    while(a != boss[a]) a = boss[a];
    while(b != boss[b]) b = boss[b];

    if(boss[a] == boss[b]) out<<"DA\n";
    else out<<"NU\n";
}

void afis()
{
    int i;
    for(i=1; i<=n; ++i) cout<<i<<" "; cout<<"\n";
    for(i=1; i<=n; ++i) cout<<boss[i]<<" "; cout<<"\n";
    cout<<"\n";
}

int main()
{
    in>>n>>m;
    for(int i=1; i<=n; ++i) boss[i] = i;
    for(int i=0; i<m; ++i)
    {
        int tip,x,y;
        in>>tip>>x>>y;
        if(tip == 1) update(x, y);
        else if(tip == 2) query(x, y);
    }

    return 0;
}