Cod sursa(job #295499)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 3 aprilie 2009 12:52:08
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <stdio.h>
int t[100005];

inline void output(int x){if (x)printf("DA\n");else printf("NU\n");}

void join(int x,int y){
  int f,a=x,b=y;
  while (t[a]!=a)a=t[a];
  while (t[b]!=b)b=t[b];
  t[b]=a;
  while (x!=t[x]){f=t[x];t[x]=a;x=f;}
  while (y!=t[y]){f=t[y];t[y]=a;y=f;}
}

void check(int x,int y){
  int f,a=x,b=y;
  while (t[a]!=a)a=t[a];
  while (t[b]!=b)b=t[b];
  while (x!=t[x]){f=t[x];t[x]=a;x=f;}
  while (y!=t[y]){f=t[y];t[y]=b;y=f;}
  if (a==b)output(1); else output(0);
}
  
int main(){
  freopen("disjoint.in","r",stdin);
  freopen("disjoint.out","w",stdout);
  int N,M,T,x,y,i;

  scanf("%d %d",&N,&M);
  //preprocesare
  for (i=1;i<=N;++i)t[i]=i;
  //
  for (; M; --M){
    scanf("%d %d %d",&T,&x,&y);
    if (T==1)join(x,y);
    else check(x,y);
  }
return 0;
}