Cod sursa(job #1496921)

Utilizator serbanSlincu Serban serban Data 5 octombrie 2015 19:54:58
Problema Paduri de multimi disjuncte Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>

using namespace std;

int v[100005];
int lg[100005];
int org[100005];

void mergeList(int a, int b) {
    if(lg[b] > lg[a]) {
        int aux = a;
        a = b;
        b = aux;
    }
    if(lg[a] == lg[b])
        lg[a] ++;

    while(b != v[b]) {
        lg[b] = lg[a];
        org[b] = org[a];
        b = v[b];
    }
    lg[b] = lg[a];
    org[b] = org[a];
}

int main()
{
    FILE *f = fopen("disjoint.in", "r");
    FILE *g = fopen("disjoint.out", "w");
    int n, m;
    int x, y, t;
    fscanf(f, "%d %d", &n, &m);

    for(int i = 1; i <= n; i ++) {
        v[i] = i;
        lg[i] = 1;
        org[i] = i;
    }

    for(int i = 1; i <= m; i ++) {
        fscanf(f, "%d %d %d", &t, &x, &y);
        if(t == 1) mergeList(x, y);
        else {
            if(org[x] == org[y])
                fprintf(g, "DA\n");
            else fprintf(g, "NU\n");
        }
    }
    return 0;
}