Cod sursa(job #584239)

Utilizator Smaug-Andrei C. Smaug- Data 24 aprilie 2011 19:16:55
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.74 kb
#include <cstdio>
#include <cstdlib>

#define MAXN 100000

int T[MAXN+10], RG[MAXN+10];

int find(int a){
  
  int R, aux;
  for(R=a; T[R]!=R; R=T[R])
    ;
  
  while(T[a]!=a){
    aux=T[a];
    T[a]=R;
    a=aux;
    }

  return R;

}

void comb(int a, int b){

  if(RG[a]>RG[b])
    T[b]=a;
  else
    T[a]=b;
  
  if(RG[a]==RG[b])
    RG[b]++;
}

int main(){

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

  int N, M, a, b, c, i;

  scanf("%d%d", &N, &M);
  for(i=0; i<N; i++){
    T[i]=i;
    RG[i]=1;
  }

  for(i=0; i<M; i++){
    scanf("%d%d%d", &a, &b, &c);
    if(a==1)
      comb(find(b), find(c));
    else {
      if(find(b) == find(c))
	printf("DA\n");
      else
	printf("NU\n");
    }
  }

  return 0;
}