Cod sursa(job #2793940)

Utilizator Casian_doispeChiriac Casian Casian_doispe Data 4 noiembrie 2021 09:46:57
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>

using namespace std;

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

struct nod
{
    nod *tatal = 0 ;

    int val ;

    int inaltime = 1 ;
};

nod v[100009] ;

int tat(nod x)
{

    if(!x.tatal)return x.val ;

    return tat(*x.tatal) ;

    int rez = tat(*x.tatal) ;

    ///v[x].tatal = &(v[rez]) ;

    return rez ;
}

void reuniune(int x, int y)
{
    if(v[x].inaltime <= v[y].inaltime) /// punem pe x in y
    {

        int a = tat(v[x]) ;
        int b = tat(v[y]) ;

        v[a].tatal = &v[b] ;

        if(v[a].inaltime == v[b].inaltime)
            v[b].inaltime ++ ;

    }
    else
    {
        int b = tat(v[x]) ;
        int a = tat(v[y]) ;

        v[a].tatal = &v[b] ;

        if(v[a].inaltime == v[b].inaltime)
            v[b].inaltime ++ ;
    }
}



bool query(int x, int y)
{

    int a = tat(v[x]) ;
    int b = tat(v[y]) ;

    return (a == b) ;
}

int main()
{
    int n, q ;

    cin >> n >> q ;

    for(int f = 1 ; f <= n ; f ++)
        v[f].val = f ;

    while(q --)
    {

        int cerinta ;

        cin >> cerinta ;

        if(cerinta == 1)
        {
            int x, y ;

            cin >> x >> y ;

            reuniune(x, y) ;
        }
        else
        {
            int x, y ;

            cin >> x >> y ;

            if(query(x, y))cout << "DA\n" ;
                else cout << "NU\n" ;
        }

    }

    return 0;
}