Cod sursa(job #2458423)

Utilizator penetavyPene Cosmin-Octavian penetavy Data 20 septembrie 2019 15:23:00
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <stdio.h>

#define N_MAX 100000

using namespace std;

FILE *fin = fopen("disjoint.in", "r");
FILE *fout = fopen("disjoint.out", "w");

int N, Q;
int boss[N_MAX + 1];
int h[N_MAX + 1];

int find(int u) {
    if (boss[u] == u)
        return u;
    else {
        boss[u] = find(boss[u]);
        return find(boss[u]);
    }
}

void unify(int u, int v) {
    int i, j;
    i = find(u);
    j = find(v);
//    boss[j] = i;
    if (h[i] > h[j]) {
        boss[j] = i;
    }
    else {
        if (h[i] < h[j])
            boss[i] = j;
        else {
            boss[i] = j;
            h[j]++;
        }
    }
}

int main(){
    int i, j;
    int x, y;
    int opp;

    fscanf(fin, "%d %d", &N, &Q);

    for (i = 1; i <= N; i++) {
        boss[i] = i;
        h[i] = 1;
    }

    for (i = 1; i <= Q; i++) {
        fscanf(fin, "%d", &opp);
        fscanf(fin, "%d %d", &x, &y);
        if(opp == 1) {
            unify(x, y);
        }
        else {
            if(find(x) == find(y))
                fprintf(fout, "DA\n");
            else
                fprintf(fout, "NU\n");
        }
    }

    fclose(fin);
    fclose(fout);
    return 0;
}