Cod sursa(job #2793961)

Utilizator rARES_4Popa Rares rARES_4 Data 4 noiembrie 2021 10:05:41
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("disjoint.in");
ofstream g ("disjoint.out");
int tati[100001];
int inaltimi[100001];
int n,m;
int tata_suprem = 0;
int gasire_tata(int x)
{
    int y =  x;
    while(x != tati[x])
        {
            x = tati[x];
        }
    while(y!=tati[y])
    {
        y = tati[y];
        tati[y] = x;
    }
    return x;
}
void inserare(int x,int y){
    int tata_final_x = gasire_tata(x);
    int tata_final_y = gasire_tata(y);
    if(inaltimi[tata_final_x]>inaltimi[tata_final_y])
    {
        tati[tata_final_y] = tata_final_x;
    }
    else if(inaltimi[tata_final_x]<inaltimi[tata_final_y])
    {
        tati[tata_final_x] = tata_final_y;
    }
    else if(inaltimi[tata_final_x]==inaltimi[tata_final_y])
    {
        tati[tata_final_y] = tata_final_x;
        inaltimi[tata_final_x] ++;
    }
}
void afisare(int x,int y)
{
    int tata_final_x = gasire_tata(x);
    int tata_final_y = gasire_tata(y);
    if(tata_final_x == tata_final_y)
    {
        g << "DA\n";
        return;
    }
    g << "NU\n";
    return;
}
int main()
{
    f >> n >> m;
    for(int i = 1;i<=n;i++){
        tati[i] = i;
        inaltimi[i] = 1;
    }
    for(int i = 1;i<=m;i++){
        int c,x,y;
        f >> c >> x >> y;
        if(c == 1){
            inserare(x,y);
        }
        else{
            afisare(x,y);
        }

    }
}