Cod sursa(job #2661362)

Utilizator reversepolishnotationAndi Dicu reversepolishnotation Data 21 octombrie 2020 20:29:13
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>
using namespace std;

#define REP(i, a, b) for (int i = a; i <= b; i++)
#define PER(i, a, b) for (int i = b; i >= a; i--)
#define TRmsi(x, it) for (map<string, int>::iterator it = x.begin(); it != x.end(); it++)
#define TRvi(x, it) for (vector<int>::iterator it = x.begin(); it != x.end(); it++)
#define TRvii(x, it) for (vector<pair<int, int>>::iterator it = x.begin(); it != x.end(); it++)
#define mp make_pair
#define pb push_back
 
typedef long long ll;
typedef double db;
typedef vector<int> vi;
typedef pair<int, int> pii;
typedef vector<int, int> vii;
typedef map<string, int> msi;

#define MAXVAL 10000

int parent[MAXVAL];
int n_elem[MAXVAL];

int traverse(int x) {

    if (x != parent[x]) {

        parent[x] = traverse(parent[x]);
        return parent[x];
    }
    
    return x;
}

bool find(int x, int y) {

    // cout << x << ' ' << traverse(x) << '\n' << y << ' ' << traverse(y) << '\n';
    return traverse(x) == traverse(y);
}

void uni(int x, int y) {
    
    if (n_elem[x] <= n_elem[y]) {

        int root_x = traverse(x);
        int root_y = traverse(y);

        n_elem[root_y] += n_elem[root_x];
        parent[root_x] = root_y;
    }
}

int main() {

    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);

    int n, n_q;
    cin >> n >> n_q;

    REP(i, 1, n) {
        parent[i] = i;
    }

    REP(i, 1, n) {
        n_elem[i] = 1;
    }
    
    REP(i, 1, n_q) {
        
        int q, a, b;
        cin >> q >> a >> b;
        
        if (q == 1) {
            uni(a, b);
        }
        else {
            cout << (find(a, b)? "DA\n" : "NU\n");
        }
    }

    return 0;
}