Cod sursa(job #3264948)

Utilizator Manolea_Teodor_StefanManolea Teodor Stefan Manolea_Teodor_Stefan Data 25 decembrie 2024 22:26:51
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>
//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")

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

int n,m;
vector<int> t(100001,-1);

int getRoot(int node) {
    while (t[node] > 0) {
        node = t[node];
    }
    return node;
}

void connect(int a, int b) {
    const int rootA = getRoot(a);
    const int rootB = getRoot(b);
    if (rootA == rootB) {
        return;
    }
    if (rootA > rootB) {
        t[rootB] += t[rootA];
        t[rootA] = rootB;
        while (a != rootA) {
            const int x = t[a];
            t[a] = rootB;
            a = x;
        }
    } else {
        t[rootA] += t[rootB];
        t[rootB] = rootA;
        while (b != rootB) {
            const int x = t[b];
            t[b] = rootA;
            b = x;
        }
    }
}

int main() {
    fin >> n >> m;
    while (m--) {
        int t,a,b;
        fin >> t >> a >> b;
        if (t == 1) {
            connect(a,b);
        } else {
            if (getRoot(a) == getRoot(b)) {
                fout << "DA\n";
            } else {
                fout << "NU\n";
            }
        }
    }
    return 0;
}