Pagini recente » Cod sursa (job #1525265) | Cod sursa (job #2623181) | Cod sursa (job #2817413) | Cod sursa (job #1217690) | Cod sursa (job #1896202)
#include <cstdio>
#include <stack>
using namespace std;
int node[100001][2];
int Find(int target){
stack<int> path;
while(node[target][1] != target){
if(node[node[target][1]][1] != node[target][1]){
path.push(target);
}
target = node[target][1];
}
while(!path.empty()){
node[path.top()][1] = target;
path.pop();
}
return target;
}
void Union(int x, int y){
int rootX = Find(x);
int rootY = Find(y);
if(node[rootX][0] > node[rootY][0]){
node[rootY][1] = rootX;
}else{
if(node[rootX][0] == node[rootY][0]){
node[rootY][0]++;
}
node[rootX][1] = rootY;
}
}
int main(){
int sets, queries, task, x, y;
freopen("disjoint.in", "r", stdin);
freopen("disjoint.out", "w", stdout);
scanf("%d %d", &sets, &queries);
for(int i = 1; i <= sets; i++){
node[i][0] = 1;
node[i][1] = i;
}
for(int i = 1; i <= queries; i++){
scanf("%d %d %d", &task, &x, &y);
if(task == 1){
Union(x, y);
}else{
printf("%s\n", (Find(x) == Find(y)) ? "DA" : "NU");
}
}
return 0;
}