Pagini recente » Cod sursa (job #201509) | Cod sursa (job #595642) | Borderou de evaluare (job #1157139) | Cod sursa (job #933947) | Cod sursa (job #2298335)
#include <bits/stdc++.h>
#define MAXN 100005
int N, M;
int Root[MAXN],
Rang[MAXN];
int Find(int X) {
int r = X;
while (Root[r] != r)
r = Root[r];
int Aux;
while (Root[X] != X)
Aux = Root[X],
Root[X] = r,
X = Aux;
return r;
}
void Union(int X, int Y) {
if (X == Y) return;
if (Rang[X] == Rang[Y]) {
Root[Y] = X;
++ Rang[X];
} else
if (Rang[Y] < Rang[X]) {
Root[Y] = X;
}
else {
Root[X] = Y;
}
}
std::ifstream In("disjoint.in");
std::ofstream Out("disjoint.out");
void Citire() {
In >> N >> M;
}
void Rezolvare() {
for (int i=1; i<=N; ++i)
Root[i] = i;
int Type, X, Y;
while (M--) {
In >> Type >> X >> Y;
if (Type == 1) Union(Find(X), Find(Y));
else if (Type == 2) Out << (Find(X) == Find(Y) ? "DA" : "NU") << '\n' ;
}
}
int main()
{
Citire();
Rezolvare();
return 0;
}