Cod sursa(job #2819247)

Utilizator Casian_doispeChiriac Casian Casian_doispe Data 18 decembrie 2021 10:18:55
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <vector>
#include <queue>
#include <climits>

#define MOD 1000000007

using namespace std;

/// timpul minim pentru toate trupele sa ajunga in nodul x
/// nodul y in care se poate ajunge cu timpul minim in general, si timpul respectiv

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

/// daca au acelasi tata sunt in aceeasi multime
/// cand se face merge la 2 multimi se leaga tatal multimii mai mici de tatal multimii mai mari

int n ;

struct nod
{
    int tatal = 0 ;

    int fii = 1, val ;
};

nod m[100009] ;

int tat(int k) /// imi da tatal suprem a lui nod
{
    if(!m[k].tatal)return k ;
        else
        {
            int tsuprem = tat(m[k].tatal) ;

            m[k].tatal = tsuprem ;

            return tsuprem ;
        }
}


int main()
{
    int q ;

    cin >> n >> q ;

    while(q --)
    {
        int a, b, c ;

        cin >> c >> a >> b ;

        if(c == 1) /// se face merge
        {
            if(m[b].fii < m[a].fii)
                swap(a, b) ;

            /// a va fi mai mic ca b

            int f = tat(a), e = tat(b) ;

            m[e].fii = min(m[f].fii + 1, m[e].fii);

            m[f].tatal = e ;
        }
        else /// se face query
        {
            if(tat(a) == tat(b))
                cout << "DA" << '\n' ;
            else cout << "NU" << '\n' ;
        }
    }

    return 0 ;
}