Cod sursa(job #1669017)

Utilizator pisiciAndrei Nita pisici Data 30 martie 2016 11:48:47
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <cstdio>
using namespace std;
int h[100001], dad[100001];
int Find(int x) {
    int y=x, root;
    while(dad[y])y=dad[y];
    root=y;
    while(dad[x]) {
        y=dad[x];
        dad[x]=root;
        x=y;
    }
    return root;
}
void Union(int x, int y) {
    if(h[x]>h[y])dad[y]=x;
    else dad[x]=y;
    if(h[x]==h[y])++h[y];

}

int main() {
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
    int n, q, i, x, y, task;
    scanf("%d%d", &n, &q);
    for(i=1; i<=n; ++i)
		h[i]=1;
    for(i=1; i<=q; ++i) {
        scanf("%d%d%d", &task, &x, &y);
        if(task==2) {
            if(Find(x)==Find(y))
				printf("DA\n");
				else 
				printf("NU\n");
        } 
		else 
        Union(Find(x),Find(y));
    }
    return 0;
}