Cod sursa(job #2629236)

Utilizator doyouhavethetimeStanculescu Gabriel doyouhavethetime Data 19 iunie 2020 16:57:29
Problema Paduri de multimi disjuncte Scor 10
Compilator c-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#define N 100000

int read () {
    int ch;
    while (!isdigit(ch=getchar()));

    int ans=0;
    do
        ans = (ans<<3) + (ans<<1) + ch - '0';
    while (isdigit(ch=getchar()));

    return ans;
}

int t[N+1], r[N+1];
int _find (int x) {
    if (!t[x])
        return x;
    return t[x]=_find(t[x]);
}

void _union (int x, int y) {
    int p1=_find(x),
        p2=_find(y);
    if (p1!=p2)
        if (r[x] > r[y]) {
            t[y] = x;
            r[x] += r[y];
        }
        else {
            t[x] = y;
            r[y] += r[x];
        }
}

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

    memset(r, 1, sizeof r);
    int n, m;
    n=read(), m=read();

    int i, j, k;
    for (; m; m--) {
        k=read(), i=read(), j=read();
        k==1 ? _union(i, j) : (void)puts(_find(i) == _find(j)?"DA":"NU");
    }
    return 0;
}