Pagini recente » Cod sursa (job #1601311) | Cod sursa (job #814586) | Cod sursa (job #1477393) | Cod sursa (job #3030997) | Cod sursa (job #2154457)
#include <iostream>
#include <fstream>
#define maxSize 100002
using namespace std;
ifstream fin ("disjoint.in");
ofstream fout ("disjoint.out");
int TT[maxSize];
int RG[maxSize];
int n,m,cer,x,y;
int find(int x)
{
int R, y;
//merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
for (R = x; TT[R] != R; R = TT[R]);
//aplic compresia drumurilor
for (; TT[x] != x;)
{
y = TT[x];
TT[x] = R;
x = y;
}
return R;
}
void unite(int x, int y)
{
//unesc multimea cu rang mai mic de cea cu rang mai mare
if (RG[x] > RG[y])
TT[y] = x;
else TT[x] = y;
//in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
if (RG[x] == RG[y]) RG[y]++;
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++){ TT[i]=i;RG[i]=1;}
for(int i=1;i<=m;i++)
{
fin>>cer>>x>>y;
if(cer==1) unite(find(x),find(y));
else
{
if(find(x)==find(y)) fout<<"DA";
else fout<<"NU";
fout<<'\n';
}
}
return 0;
}