Cod sursa(job #228482)

Utilizator blasterzMircea Dima blasterz Data 7 decembrie 2008 13:07:43
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <cstdio>
#define N 100001
#define DIM 8192
#include <ctime>
#include <cstdlib>

char ax[DIM];
int pz;

inline void cit(int &x)
{
	x=0;
	while(ax[pz]<'0' || ax[pz]>'9')
		if(++pz==DIM)fread(ax,1,DIM,stdin),pz=0;
	while(ax[pz]>='0' && ax[pz]<='9')
	{
		x=x*10+ax[pz]-'0';
		if(++pz==DIM)fread(ax,1,DIM,stdin),pz=0;
	}
}

int t[N];
int n, m;

inline int find(int i)
{
	if(t[i] != i) t[i]=find(t[i]);
	return t[i];
}
inline void uneste(int i, int j)
{
	i=find(i);
	j=find(j);
	if(i == j) return;
	if(rand()&1)t[i]=j;else t[j]=i;
}



int main()
{
	srand(time(0));
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	cit(n);cit(m);
	
	int tp, p, q;
	
	for(int i=1;i<=n;++i) t[i]=i;
	
	while(m--)
	{
		cit(tp);cit(p);cit(q);
		if(tp == 1) uneste(p,q);
		else 
		{
			if(find(p) == find(q)) printf("DA\n");
			else printf("NU\n");
		}
	}
		

	return 0;
}