Pagini recente » Cod sursa (job #2841951) | Cod sursa (job #590250) | Cod sursa (job #1045354) | Cod sursa (job #1721952) | Cod sursa (job #1845237)
#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;
}