Cod sursa(job #3163025)

Utilizator diana_dd03Dorneanu Diana diana_dd03 Data 30 octombrie 2023 12:44:14
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

int t[100005];
/**
t[i]= 0, daca i este rad
    =j,daca j este predecesorul lui i in drumul de la i la rad
*/
int n, m, op, x, y;
//O(log* n) ->O(1)(tinde)
int FindRoot(int x){
    int y, rad=x;
    while(t[rad]!=0)
        rad=t[rad];
    ///comprimarea drumului
    while(x!=rad){
        y=t[x];
        t[x]=rad;
        x=y;
    }
    return rad;
}
//O(1)
void Union(int x, int y){
    t[y]=x;
}

int main(){
    fin>>n>>m;
    //O(m x log* n)
    for(int i=1;i<=m;i++){
        fin>>op>>x>>y;
        x=FindRoot(x);
        y=FindRoot(y);
        if(op==1)
            Union(x, y);

        else
            if(x==y)
                fout<<"DA\n";
            else fout<<"NU\n";
    }
    return 0;
}