Cod sursa(job #3150034)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 14 septembrie 2023 15:28:44
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>
#pragma GCC optimize ("Ofast")
#pragma GCC target ("popcnt")

using namespace std;

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

const int MAX_N = 100000;
int n;

struct DSU{
    int parent[MAX_N + 5];
    int marime[MAX_N + 5];

    inline void build(){
        for(int node=1; node<=n; node++){
            parent[node] = node;
            marime[node] = 1;
        }
    }

    inline int get_root(int node){
        if(parent[node] == node)
            return node;
        else
            return parent[node] = get_root(parent[node]);
    }

    inline void join(int node1, int node2){
        int root1 = get_root(node1);
        int root2 = get_root(node2);
        if(marime[root1] < marime[root2]){
            parent[root1] = root2;
            marime[root2] += marime[root1];
        }else{
            parent[root2] = root1;
            marime[root1] += marime[root2];
        }
    }

    inline void query(int node1, int node2){
        int root1 = get_root(node1);
        int root2 = get_root(node2);
        if(root1 == root2)
            fout<<"DA\n";
        else
            fout<<"NU\n";
    }
} tree;

int m;
struct query{
    int t, x, y;
} q;

int main (){
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr), fout.tie(nullptr);

    fin>>n>>m;

    tree.build();
    for(int i=1; i<=m; i++){
        fin>>q.t>>q.x>>q.y;
        if(q.t == 1){ ///update
            tree.join(q.x, q.y);

        }else if(q.t == 2){ ///query
            tree.query(q.x, q.y);
        }
    }
    return 0;
}