Cod sursa(job #2497513)

Utilizator AnduebossAlexandru Ariton Andueboss Data 22 noiembrie 2019 19:54:51
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
//
//  main.cpp
//  Paduri De Multimi Disjuncte
//
//  Created by Andu Andu on 22/11/2019.
//  Copyright © 2019 Andu Andu. All rights reserved.
//

// #include <iostream>
#include <fstream>
#include <vector>
#define func int
#define N 100001

std::ifstream cin ("disjoint.in");
std::ofstream cout ("disjoint.out");


int m, n;
int a,b,c;
int tt[N];
int h[N];

using namespace std;

func calc(int x) {
    int y = x;
    while (tt[y] != y) {
        y = tt[y];
    }
    while(tt[x]!=y)
    {
        int z;
        z=x;
        x=tt[x];
        tt[z]=y;
    }
    return y;
}

void merge(int x, int y) {
    x = calc(x);
    y = calc(y);
    tt[y] = x;
    h[x] = max(h[x],h[y]+1);
}

bool afla(int x, int y) {
    x = calc(x);
    y = calc(y);
    return x==y;
}

int main() {
    cin>>n>>m;
    for (int i=1; i<=n; i++) {
        tt[i] = i;
        h[i] = 1;
    }
    for (int i=1;i<=m;i++) {
        cin>>a>>b>>c;
        if ( a == 1 ) {
            merge(b,c);
        } else if (a==2) {
            int alef0 = afla(b, c);
            if (alef0 == 1) {
                cout<<"DA\n";
            } else  {
                cout<<"NU\n";
            }
        }
    }
    return 0;
}