Pagini recente » Cod sursa (job #440411) | Cod sursa (job #1088367) | Cod sursa (job #2245286) | Cod sursa (job #472178) | Cod sursa (job #2378156)
#include <vector>
#include <stdio.h>
#include <algorithm>
#define NMAX 200055
#define MMAX 200055
int n,m,h[NMAX],t[NMAX];
void MakeSet(int x)
{
for(int i=1;i<=n;++i)
h[i]=0,t[i]=i;
}
int Find(int x)
{
int r=x;
while(t[r]!=r)r=t[r];
int i=x,j;
while(i!=r)
{
j=t[i];
t[i]=r;
i=j;
}
return r;
}
void Union(int x,int y)
{
int rx=Find(x),ry=Find(y);
if(rx==ry)return;
if(h[rx] < h[ry])
t[rx]=ry;
else
if(h[rx] > h[ry])
t[ry]=rx;
else
{
t[ry]=rx;
h[rx]++;
}
}
int main()
{
// FILE *fin = fopen("disjoint.in","r");
// FILE *fout = fopen("disjoint.out","w");
freopen("disjoint.in","r",stdin);
freopen("disjoint.out","w",stdout);
int tip,x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)MakeSet(i);
for(int i=1;i<=m;++i)
{
scanf("%d%d%d",&tip,&x,&y);
if(tip==1)
{
Union(x,y);
}
else
{
if(Find(x)==Find(y))printf("DA\n");
else printf("NU\n");
}
}
}