Cod sursa(job #2977019)

Utilizator Chiri_Robert Chiributa Chiri_ Data 10 februarie 2023 17:38:34
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

int n, m;
int x, y, t;
int tati[100001];
int height[100001];

int find(int i) {
    int rez = i;
    vector<int> parcurs;
    while (tati[rez] != rez) {
        parcurs.push_back(rez);
        rez = tati[rez];
    }

    for (int x : parcurs) {
        tati[x] = rez;
    }

    return rez;
}

void unire(int i, int j) {
    int r1 = find(i);
    int r2 = find(j);

    if (height[r1] > height[r2]) {
        tati[r2] = r1;
    } else {
        tati[r1] = r2;
        height[r2] = max(height[r2] + 1, height[r1]);
    }
}

int main() {
    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        tati[i] = i;
        height[i] = 1;
    }

    for (int i = 0; i < m; i++) {
        fin >> t >> x >> y;
        if (t == 1) {
            unire(x, y);
        } else {
            int r1 = find(x);
            int r2 = find(y);

            if (r1 == r2) {
                fout << "DA\n";
            } else {
                fout << "NU\n";
            }
        }
    }
}