Cod sursa(job #1496914)

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

using namespace std;

int n, m;
int v[100005];
int nxt[100005];
int first[100005];
int last[100005];
int lg[100005];

void mergeList(int a, int b) {

    if(v[a] != v[b]) {
        if(lg[a] < lg[b]) {
            int aux = a;
            a = b;
            b = aux;
        }
        if(lg[a] == lg[b])
            lg[a] ++;

        nxt[last[a]] = first[b];
        for(int i = first[b]; i; i = nxt[i]) {
            v[i] = v[a];
            first[i] = first[a];
            lg[b] = lg[a];
        }
        int ok = last[a];
        int i;
        for(i = first[a]; i != ok; i = nxt[i])
            last[i] = last[b];
        last[i] = last[b];
    }

}

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

    int k = 0;
    for(int i = 1; i <= n; i ++) {
        v[i] = i;
        first[i] = i;
        last[i] = i;
        lg[i] = 1;
    }

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