Cod sursa(job #2951547)

Utilizator Alex18maiAlex Enache Alex18mai Data 6 decembrie 2022 18:52:23
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

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

vector<vector<int>> galeti;
vector<int> inCeGaleataSunt;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int n, m;
    cin>>n>>m;

    galeti.resize(n+1);
    inCeGaleataSunt.resize(n+1);

    for (int i=1; i<=n; i++){
        galeti[i].push_back(i);
        inCeGaleataSunt[i] = i;
    }

    for (int i=1; i<=m; i++){
        int op, x, y;
        cin>>op>>x>>y;

        if (op == 1){ // adaug o galeata la alta
            // x este in galeata inCeGaleataSunt[x]
            // y este in galeata inCeGaleataSunt[y]
            // cum le combin? care galeata e turnata in care? -> torn mai mic in mai mare

            int gX = inCeGaleataSunt[x], gY = inCeGaleataSunt[y];
            if (galeti[gX].size() > galeti[gY].size()){
                // torn y in x
                for (auto &elem: galeti[gY]){
                    galeti[gX].push_back(elem); // torn in galeata
                    inCeGaleataSunt[elem] = gX; // schimb indicele galetii in care sunt
                }
                galeti[gY].clear(); // nu mai am nimic in galeata pentru ca le-am turnat
            }
            else{
                // torn x in y
                for (auto &elem: galeti[gX]){
                    galeti[gY].push_back(elem); // torn in galeata
                    inCeGaleataSunt[elem] = gY; // schimb indicele galetii in care sunt
                }
                galeti[gX].clear(); // nu mai am nimic in galeata pentru ca le-am turnat
            }
        }
        else{
            int gX = inCeGaleataSunt[x], gY = inCeGaleataSunt[y];
            if (gX == gY){
                cout<<"DA"<<'\n';
            }
            else{
                cout<<"NU"<<'\n';
            }
        }
    }

    return 0;
}