Pagini recente » Cod sursa (job #2496961) | Cod sursa (job #923232) | Cod sursa (job #1983438) | Cod sursa (job #930312) | Cod sursa (job #1660752)
#include <stdio.h>
#include <stdlib.h>
int find(int *, int);
void unite(int *, int *, int, int);
int main(){
int n, m, c, x, y, *t, *r, i;
freopen("disjoint.in","r", stdin);
freopen("disjoint.out","w", stdout);
scanf("%i%i",&n,&m);
t = (int *) malloc((n + 1) * sizeof(int));
r = (int *) malloc((n + 1) * sizeof(int));
for(i = 1; i <= n; ++i){
t[i] = i;
r[i] = 1;
}
while(m){
scanf("%i %i %i", &c, &x, &y);
if(c == 2){
if(find(t, x) == find(t, y)){
printf("DA\n");
}
else{
printf("NU\n");
}
}
else{
unite(t, r, find(t, x), find(t, y));
}
--m;
}
return 0;
}
int find(int *t, int x){
int tx = x, y;
while(t[tx] != tx){
tx = t[tx];
}
while(t[x] != x){
y = t[x];
t[x] = tx;
x = y;
}
return tx;
}
void unite(int *t, int *r, int x, int y){
if(r[x] < r[y]){
t[x] = y;
}
else{
t[y] = x;
}
if(r[x] == r[y]){
r[x]++;
}
}