Cod sursa(job #1845237)

Utilizator msciSergiu Marin msci Data 11 ianuarie 2017 02:48:37
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <bits/stdc++.h>
using namespace std;
#define rep(i, from, to) for (int i = (from); i < (to); ++i)
#define trav(a, x) for (auto& a : x)
#define all(x) (x).begin(), (x).end()
#define sz(x) (int) (x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
template<typename T> void _dbg(const char *sdbg, T h) { cerr << sdbg << " = " << h << endl; }
template<typename T, typename...U> void _dbg(const char *sdbg, T h, U... a) {
    while (*sdbg != ',') cerr << *sdbg++; cerr << " = " << h << ", "; _dbg(sdbg + 1, a...);
}
template<typename T> ostream& operator<<(ostream &os, vector<T> v) {
    os << "["; for (int i = 0; i < sz(v) - 1; i++) os << v[i] << ", "; os << v[sz(v) - 1]; os << "]";
    return os;
}
template<typename T, typename U> ostream& operator<<(ostream &os, pair<T, U> p) {
    os << "(" << p.first << ", " << p.second << ")"; 
    return os;
}
#ifdef LOCAL
#define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#else
#define debug(...) (__VA_ARGS__)
#define cerr if(0)cout
#endif

struct UnionFind {
    vi par, rank, size; int c;
    UnionFind(int n) : par(n), rank(n, 0), size(n, 1), c(n) {
        for (int i = 0; i < n; i++) par[i] = i;
    }

    int find(int i) { return (par[i] == i ? i : (par[i] = find(par[i]))); }
    bool same(int i, int j) { return find(i) == find(j); }
    int get_size(int i) { return size[find(i)]; }
    int count() { return c; }

    void merge(int i, int j) {
        if ((i = find(i)) == (j = find(j))) return;
        c--;
        if (rank[i] > rank[j]) swap(i, j);
        par[i] = j; size[j] += size[i];
        if (rank[i] == rank[j]) rank[j]++;
    }
};

int main() {
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
    cin.sync_with_stdio(false); cin.tie(0); cin.exceptions(cin.failbit);
    int N, M;
    cin >> N >> M;
    UnionFind uf(N);
    rep(ii, 0, M) {
        int cod, x, y;
        cin >> cod >> x >> y;
        x--, y--;
        if (cod == 1) uf.merge(x, y);
        else cout << (uf.same(x, y) ? "DA" : "NU") << "\n";
    }
    return 0;
}