Cod sursa(job #234255)

Utilizator AndreyPAndrei Poenaru AndreyP Data 20 decembrie 2008 15:26:41
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include<stdio.h>
#define N 100010
int n,m,rg[N],t[N];
char da[]={'D','A','\n','\0'};
char nu[]={'N','U','\n','\0'};
int find(int x)
{
	int r,aux;
	for(r=x; t[r]!=r; r=t[r])
		;
	while(t[x]!=x)
	{
		aux=t[x];
		t[x]=r;
		x=aux;
	}
	return r;
}
void unire(int x,int y)
{
	if(rg[x]<rg[y])
		t[x]=y;
	else
		t[y]=x;
	if(rg[x]==rg[y])
		++rg[x];
}
int main()
{
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	scanf("%d%d\n",&n,&m);
	for(int i=1; i<=n; i++)
	{
		t[i]=i;
		rg[i]=1;
	}
	char cod;
	int x,y;
	for(; m; m--)
	{
		cod=fgetc(stdin);
		scanf("%d%d\n",&x,&y);
		if(cod=='1')
			unire(find(x),find(y));
		else
		{
			if(find(x)==find(y))
				fputs(da,stdout);
			else
				fputs(nu,stdout);
		}
	}
	return 0;
}