Pagini recente » Cod sursa (job #926140) | Cod sursa (job #195208) | Cod sursa (job #2585752) | Cod sursa (job #190000) | Cod sursa (job #2779429)
#include <iostream>
#include <fstream>
#define endl '\n'
using namespace std;
struct Node {
int rnk;
Node *prt;
};
static int N, M;
static Node *A[100001];
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
void makeSet(int p) {
Node *cur = new Node;
cur->prt = cur;
cur->rnk = 0;
A[p] = cur;
}
Node* findSet(Node *p) {
while (p != p->prt)
p = p->prt;
return p;
}
void unite(Node *a, Node *b) {
a = findSet(a);
b = findSet(b);
if (a != b) {
if (a->rnk > b->rnk) {
b->prt = a;
a->rnk = b->rnk+1;
} else {
a->prt = b;
b->rnk = a->rnk+1;
}
}
}
int main() {
fin >> N >> M;
for (int i=1; i<=N; i++)
makeSet(i);
for (int i=0; i<M; i++) {
int c, x, y;
fin >> c >> x >> y;
if (c == 1) {
unite(A[x], A[y]);
} else {
fout << (findSet(A[x]) == findSet(A[y]) ? "DA" : "NU") << endl;
}
}
}