Cod sursa(job #1251406)

Utilizator hevelebalazshevele balazs hevelebalazs Data 29 octombrie 2014 13:43:56
Problema Paduri de multimi disjuncte Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.66 kb
#include <stdio.h>
#include <stdlib.h>
#define w(n,t) (t*)malloc((n)*sizeof(t))
#define fr(i,a,b) for(i=a;i<b;++i)
int*p,*P;
int g(int i){
    int j=i;
    while(j!=p[j])j=p[j];
    return p[i]=j;
    }
void G(int i,int j){
    if(P[i]<P[j])i^=j^=i^=j;
    p[j]=i;
    P[i]+=P[i]==P[j];
    }
int main(){
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    int n,m,t,a,b;
    scanf("%i%i",&n,&m);
    p=w(n,int);P=w(n,int);
    fr(t,0,n)p[t]=t,P[t]=1;
    while(m--){
        scanf("%i%i%i",&t,&a,&b);--a,--b;
        t==1?G(g(a),g(b)):printf(g(a)==g(b)?"DA\n":"NU\n");
        }
    free(p);free(P);
    return 0;
    }