Pagini recente » Cod sursa (job #41701) | Cod sursa (job #1318913) | Cod sursa (job #1671794) | Cod sursa (job #667303) | Cod sursa (job #1051665)
#include<cstdio>
using namespace std;
const int MAXN=100005;
int n,m;
int parent[MAXN],rang[MAXN];
bool find(int x,int y)
{
int i,j;
//ITEREZ PANA LA RADACINI
for (i=x; parent[i]!=i; i=parent[i]);
for (j=y; parent[j]!=j; j=parent[j]);
//Compresia de drumuri
for (; x!=i; parent[x]=i, x=parent[x]);
for (; y!=j; parent[y]=j, y=parent[y]);
//RETURN
return (i==j);
}
void unite(int x,int y)
{
if (rang[x]>rang[y])
parent[y]=x;
else
parent[x]=y;
if (rang[x]==rang[y])
++rang[y];
}
int main()
{
int cmd,x,y,i,k;
freopen("disjoint.in","r",stdin);
freopen("disjoint.out","w",stdout);
scanf("%d%d",&n,&m);
//INITIALIZARE
for (i=1; i<=n; rang[i]=1, parent[i]=i, ++i);
//PARSARE
for (k=1; k<=m; ++k)
{
scanf("%d%d%d",&cmd,&x,&y);
if (cmd==1)
{
unite(x,y);
}
else
{
if (find(x,y))
printf("DA\n");
else
printf("NU\n");
}
}
return 0;
}