Pagini recente » Cod sursa (job #1952036) | Cod sursa (job #895027) | Cod sursa (job #1023965) | Cod sursa (job #1126029) | Cod sursa (job #359863)
Cod sursa(job #359863)
#include <stdio.h>
#define nmax 100010
int N,M,RG[nmax],TT[nmax]; //reuniune dupa limitele superioare a rangului fiecarui multimi si compresia drumurilor
int root(int num)
{int R,j,x,r; //compresia drurilor
for(R=TT[num];R!=TT[R];R=TT[R]);
for(;num!=TT[num];)
{j=TT[num];TT[num]=R;num=j;}
return R;
}
void unite(int R1,int R2)
{if(RG[R1]>RG[R2]) TT[R2]=R1; //lim_de_rang_max(B,A)= A U B ,unde A si B doua multimi ce trebuiesc reunite
else TT[R1]=R2;
if(RG[R1]==RG[R2]) RG[R2]++;
}
int main()
{freopen("disjoint.in","r",stdin);
freopen("disjoint.out","w",stdout);
int i,tip,x,y;
scanf("%d %d",&N,&M);
for(i=1;i<=N;i++) {RG[i]=1;TT[i]=i;}
for(i=1;i<=M;i++)
{scanf("%d %d %d",&tip,&x,&y);
if(tip==2)
{if(root(x)==root(y)) printf("DA\n");
else printf("NU\n");
}
else unite(root(x),root(y));
}
fclose(stdin);fclose(stdout);return 0;
}