Cod sursa(job #2210713)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 7 iunie 2018 19:01:57
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define MAXN 100005

using namespace std;

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

int n,m,inaltime[MAXN],tata[MAXN];


int Find(int nod){
    int stapan = nod,copie;

    while(tata[stapan] != stapan)
        stapan = tata[stapan];
    while(tata[nod] != nod){
        copie = nod;
        nod = tata[nod];
        tata[copie] = stapan;
    }
    return stapan;
}


void Union(int x,int y){
    int stapan1 = Find(x),stapan2 = Find(y);

    if(inaltime[stapan1] <= inaltime[stapan2])
        tata[stapan1] = stapan2;
    if(inaltime[stapan2] < inaltime[stapan1])
        tata[stapan1] = stapan2;
    if(inaltime[stapan1] == inaltime[stapan2])
        inaltime[stapan2]++;
}



int main()
{
    int n,q,x,y,task;

    in>>n>>q;

    for(int i = 1; i <= n; i++){
        tata[i] = i;
        inaltime[i] = 1;
    }
    for(int i = 1; i <= q; i++){
        in>>task>>x>>y;
        if(task == 1)
            Union(x,y);
        else{
            if(Find(x) == Find(y))
                out<<"DA";
            else
                out<<"NU";
            out<<"\n";
        }

    }

    return 0;
}