Cod sursa(job #526161)

Utilizator CBogdanCiobanu Bogdan CBogdan Data 27 ianuarie 2011 16:21:53
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include<cstdio>
using namespace std;

int n,m,act,a,b,i,T[100005],R[100005],cauta(int x);

void read(),solve(),uneste(int x, int y);

int main()
{
	read();
	solve();
	return 0;
}

void read()
{
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{
		T[i]=i;
		R[i]=1;
	}
}

void solve()
{
	for(;m;m--)
	{
		scanf("%d%d%d",&act,&a,&b);
		if(act==1) uneste(a,b);
		else cauta(a)==cauta(b)?printf("DA\n"):printf("NU\n");
	}
}

void uneste(int x,int y)
{
	cauta(x);
	cauta(y);
	if(R[a]>R[b]){T[b]=a;R[a]+=R[b];}
	else {T[a]=b;R[b]+=R[a];}
}

int cauta(int x)
{
	int aux,t;
	for(t=x;t!=T[t];t=T[t]);
	for(;x!=T[x];)
	{
		aux=T[x];T[x]=t;x=aux;
	}
	return t;
}