Cod sursa(job #2853147)

Utilizator rARES_4Popa Rares rARES_4 Data 19 februarie 2022 22:48:07
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("disjoint.in");
ofstream g ("disjoint.out");
int tati[100001],inaltimi[100001];
int n,m,c,x,y;
int gasire_tata(int x)
{
    while(tati[x]!=x)
    {
        x = tati[x];
    }
    return x;
}
void aplatizare(int x,int tata)
{
    while(tati[x]!=x)
    {
        x = tati[x];
        tati[x] = tata;
    }
}
void unire(int x1,int x2)
{
    int tata1 = gasire_tata(x1);
    int tata2 = gasire_tata(x2);
    aplatizare(x1,tata1);
    aplatizare(x2,tata2);
    if(inaltimi[tata1]>inaltimi[tata2])
    {
        inaltimi[tata2] = inaltimi[tata1]
        tati[tata2] = tata1;
    }
    else if(inaltimi[tata1]<inaltimi[tata2])
    {
        inaltimi[tata2]=inaltimi[tata1];
        tati[tata1] = tata2;
    }
    else
    {
        tati[tata1] = tata2;
        inaltimi[tata1]++;
    }
}
void init()
{
    for(int i= 1; i<=n; i++)
    {
        tati[i] = i;
        inaltimi[i] = 1;
    }
}
void citire()
{
    f >> n >> m;

}
void rez()
{
    for(int i =1 ; i<=m; i++)
    {
        f >> c;
        if(c == 1)
        {
            int x,y;
            f >> x >> y;
            unire(x,y);
        }
        else
        {
            int x,y;
            f >> x >> y;
            int tatax = gasire_tata(x);
            int tatay = gasire_tata(y);

            if(tatax==tatay)
                g << "DA";
            else
                g <<"NU";
            g << '\n';
        }
    }
}
int main()
{
    citire();
    init();
    rez();
}