Pagini recente » Cod sursa (job #1022170) | Cod sursa (job #674932) | Cod sursa (job #1539462) | Cod sursa (job #2297221) | Cod sursa (job #3207075)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("disjoint.in");
ofstream cout("disjoint.out");
int n, q;
vector<int> parent;
vector<int> rang;
int find(int x) {
int repX;
for (repX = x; parent[repX] != repX; repX = parent[repX]);
int p = repX;
for (repX = x; parent[repX] != repX; repX = parent[repX])
{
parent[repX] = p;
}
return repX;
}
void unire(int x, int y) {
int a = find(x);
int b = find(y);
if (a == b) return;
if (rang[a] < rang[b])
parent[a] = b;
else if (rang[a] > rang[b])
parent[b] = a;
else
{
parent[a] = b;
rang[b]++;
}
}
int main()
{
cin >> n >> q;
parent.resize(n + 1);
rang.resize(n + 1);
for (int i = 1; i <= n; i++)
{
parent[i] = i;
}
while (q--)
{
int caz, x, y;
cin >> caz >> x >> y;
if (caz == 1)
{
unire(x, y);
}
else
{
if (find(x) == find(y)) cout << "DA\n";
else cout << "NU\n";
}
}
}