Pagini recente » Cod sursa (job #800539) | Cod sursa (job #825245) | Cod sursa (job #1442504) | Cod sursa (job #1553435) | Cod sursa (job #3148594)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("disjoint.in");
ofstream fout ("disjoint.out");
const int maxDim = 1e5 + 5;
int n , m , parent[maxDim] , height[maxDim];
class DSU
{
public:
void Initialise ()
{
for(int i = 1 ; i <= n ; ++i)
{
parent[i] = i;
height[i] = 1;
}
}
void Union (int a , int b)
{
int rootA = Find(a) , rootB = Find(b);
if(rootA != rootB)
{
if(height[rootA] < height[rootB])
parent[rootA] = rootB;
else if(height[rootB] < height[rootA])
parent[rootB] = rootA;
else
{
parent[rootA] = rootB;
height[rootB]++;
}
}
}
int Find (int a)
{
int rootA = a;
while(parent[rootA] != rootA)
rootA = parent[rootA];
while(parent[a] != rootA)
{
int auxiliary = parent[a];
parent[a] = rootA;
a = auxiliary;
}
return rootA;
}
};
DSU sets;
int main()
{
fin >> n >> m;
sets.Initialise();
for(int i = 1 ; i <= m ; ++i)
{
int operation , a , b;
fin >> operation >> a >> b;
if(operation == 1)
sets.Union(a , b);
else
{
bool result = (sets.Find(a) == sets.Find(b));
if(result)
fout << "DA\n";
else
fout << "NU\n";
}
}
}