Cod sursa(job #2561161)

Utilizator AndreosAndrei Otetea Andreos Data 28 februarie 2020 17:08:03
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <cstdio>
using namespace std;

int n, m, v[100005], r[100005], i, q, x, y, j, t1, t2, t;

void print(int v[]) {
    for(int i = 1; i <= n; ++i)
        printf("%d ", v[i]);
    printf("\n");
}

int find(int x) {
    int rad,y;
    for(rad=x ; v[rad]!=rad; rad=v[rad]);

    while(x != v[x])
    {
        y=v[x];
        v[x]=rad;
        x=y;
    }
    return rad;
}

void unite(int x, int y) {
    if(r[x]>r[y])
         v[y]=x;
    else
        v[x]=y;
    if(r[x]==r[y])
        r[y]++;
}

int main() {
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(i = 1; i <= n; ++i)
        v[i] = i;
    for(i = 1; i <= m; ++i) {
        scanf("%d%d%d", &q, &x, &y);
        if(q == 1) {
            unite(find(x),find(y));
            //print(v);
            //print(r);
        }
        else
            if(find(x) == find(y))
                printf("DA\n");
            else
                printf("NU\n");
    }
}