Pagini recente » Cod sursa (job #3124028) | Cod sursa (job #2100977) | Cod sursa (job #475552) | Cod sursa (job #1398880) | Cod sursa (job #1867083)
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#define pb push_back
#define NMax 100010
#define nod pair<int, int>
using namespace std;
int N, M, tata[NMax], rang[NMax], i, cod, x, y;
int radacina(int x)
{
int rad, y;
rad=tata[x];
while(tata[rad]!=rad)// aflu radacina multimii in care se afla x
rad=tata[rad];
while(tata[x]!=x)// atribui fiecarui element din arborele lui x radacina deja aflata
{
y=tata[x];
tata[y]=rad;
x=y;
}
return rad;
}
void unire(int x, int y)
{
if(rang[x]>rang[y])// unesc multimile prin schimbarea radacinilor
tata[x]=y;
else tata[y]=x;
if(rang[x]==rang[y])// daca au ranguri egale maresc rangul noii multimi cu 1
rang[x]++;
}
int main()
{
freopen("disjoint.in","r",stdin);
freopen("disjoint.out","w",stdout);
scanf("%d %d\n",&N,&M);
for(i=1; i<=N; i++)// fiecare arbore are rang 1 si radacina sa e i
{
tata[i]=i;
rang[i]=1;
}
for(i=1; i<=M; i++)
{
scanf("%d %d %d\n",&cod,&x,&y);
if(cod==1)
{
unire(radacina(x), radacina(y));
}
else
{
if(radacina(x)==radacina(y)) printf("DA\n");
else printf("NU\n");
}
}
return 0;
}