Cod sursa(job #235499)

Utilizator alexeiIacob Radu alexei Data 24 decembrie 2008 10:12:00
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include<stdio.h>
#define NMAX 100002
int A1[NMAX],A2[NMAX];

void destroy(const int a,const int b)
{
	if( A2[a]>A2[b] )
		A1[a]=b;
	else
		A1[b]=a;
	
	if( A2[a]==A2[b] ){
		++A2[a];
	return;
	}
}
int seek(int v1)
{
	int v2,v3;
	for( v2=v1; A1[v2]!=v2; v2=A1[v2]);
	for(; A1[v1]!=v1; )
	{
			v2=A1[v1];
			A1[v1]=v2;
			v1=v2;
	}
	return v2;
}
int main(){

	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);

	int N,Q;
	scanf("%d%d\n",&N,&Q);
	
	int i;
	for(i=1; i<=N; ++i)
	{
		A1[i]=i;
		A2[i]=1;
	}
	
	int a1,a2,a3;
	while( Q-- )
	{
		scanf("%d%d%d\n",&a1,&a2,&a3);
		if( a1==1 )
			destroy(seek(a2),seek(a3));
		else
		{
			if( seek(a2) == seek(a3) )
				printf("DA\n");
			else
				printf("NU\n");
		}
	}

	return 0;
}