Pagini recente » Cod sursa (job #39859) | Cod sursa (job #2283620) | Cod sursa (job #1950386) | Cod sursa (job #135813) | Cod sursa (job #2198143)
#include <bits/stdc++.h>
#define dimn 100000
#define mp std::make_pair
std::ifstream f("disjoint.in");
std::ofstream g("disjoint.out");
int N;
int root[dimn], rang[dimn];
int find(int x) {
int y; y = x;
while(root[y] != y) y = root[y];
int aux;
while(root[x] != x) { //compresie
aux = root[x];
root[x] = y;
x = aux;
}
return y;
}
void unite(int y, int x) {
if(find(y) == find(x)) return;
if(rang[x] > rang[y]) root[y] = x;
else root[x] = y;
if(rang[y] == rang[x]) rang[y]++; //doar aici se modif inaltimea arborelui
}
void rezolvare() {
f >> N;
for (int i=0; i<N; i++)
root[i+1] = i+1;
int m; f >> m;
for (int i=0, t, y, x; i<m; i++) {
f >> t >> y >> x;
if(t==1) unite(find(y), find(x));
else g << (find(x) == find(y) ? "DA\n" : "NU\n");
}
}
int main()
{
rezolvare();
return 0;
}