Cod sursa(job #3318907)

Utilizator Mirc100Mircea Octavian Mirc100 Data 29 octombrie 2025 17:33:47
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("disjoint.in");
ofstream cout("disjoint.out");

int n, m;
vector<int> tt;
vector<int> r;
vector<int> s;

int Find(int x){
    if (tt[x] == 0)
        return x;
    tt[x] = Find(tt[x]);
    return tt[x];
}
void Union_by_R(int x, int y){
    int tt_x = Find(x);
    int tt_y = Find(y);
    if (r[tt_x] > r[tt_y]){
        tt[tt_y] = tt_x;
    }
    else {
        tt[tt_x] = tt_y;
        if(r[tt_x] == r[tt_y])
            r[tt_y]+=1;
    }
}
void Union_by_S(int x, int y){
    int tt_x = Find(x);
    int tt_y = Find(y);
    if (s[tt_x] > s[tt_y]){
        tt[tt_y] = tt_x;
        s[tt_x]+=s[tt_y];
    }
    else {
        tt[tt_x] = tt_y;
        s[tt_y]+=s[tt_x];
    }
}


int main(){

    cin>>n>>m;
    tt.assign(n+1, 0);
    r.assign(n+1, 0);
    s.assign(n+1, 1);
    for (int i=0; i<m; i++){
        int o, e1, e2;
        cin>>o>>e1>>e2;
        if (o == 1){
            Union_by_S(e1, e2);
        }
        else {
            int tt_e1 = Find(e1);
            int tt_e2 = Find(e2);
            if (tt_e1 == tt_e2){
                cout<<"DA\n";
            }
            else{
                cout<<"NU\n";
            }

        }

    }


    return 0;
}