Cod sursa(job #2701331)

Utilizator H7GhosTSuruceanu Daniel H7GhosT Data 30 ianuarie 2021 15:08:39
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>
using namespace std;

const int mxN = 1e5 + 100;
int parent[mxN];
int rang[mxN];

char buff[mxN * 3];
char * buffp = buff;

#define FL(nm) do { freopen(nm ".in", "r", stdin); freopen(nm ".out", "w", stdout); } while (false)
int main() {
    // FL("disjoint");
    int n, m;

    scanf("%d%d", &n, &m);

    for (int i = 0; i < n + 1; i++) {
        parent[i] = i;
        rang[i] = 0;
    }

    while (m--) {
        int o, i, j;
        scanf("%d%d%d", &o, &i, &j);

        if (o == 1) {
            if (rang[i] > rang[j]) {
                parent[j] = parent[i];
            } else {
                parent[i] = parent[j];
            }
            if (rang[i] == rang[j]) {
                rang[j]++;
            }
        } else if (o == 2) {
            int pi = i;
            int pj = j;

            while (parent[pi] != pi) {
                pi = parent[pi];
            }
            while (parent[i] != i) {
                int tmp = parent[i];
                parent[i] = pi;
                i = tmp;
            }
            while (parent[pj] != pj) {
                pj = parent[pj];
            }
            while (parent[j] != j) {
                int tmp = parent[j];
                parent[j] = pj;
                j = tmp;
            }
            if (pi == pj) {
                strcpy(buffp, "DA\n");
            } else {
                strcpy(buffp, "NU\n");
            }
            buffp += 3;
        }
    }

    puts(buff);

    return 0;
}