Cod sursa(job #3030649)

Utilizator SamurayxJackDiaconescu Octavian SamurayxJack Data 17 martie 2023 19:46:03
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.82 kb
#include<bits/stdc++.h>
using namespace std;

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

const int Nmax=1e5+1;

int n,m,T[Nmax],Nr[Nmax];

void Union(int, int);
bool ok(int,int);
int Find(int);
int main(){
    int t,a,b;
    fin>>n>>m;
    for(int i=1;i<=n;i++) T[i]=i,Nr[i]=1;
    for(int i=1;i<=m;i++){
        fin>>t>>a>>b;
        if(t==1) Union(Find(a),Find(b));
        else if(ok(a,b)) fout<<"DA"<<'\n'; else fout<<"NU"<<'\n';
    }

    return 0;
}
void Union(int a, int b){
    if(Find(a)==Find(b)) return ;
    if(Nr[a]>Nr[b]) T[b]=T[a];
    else T[a]=T[b];
    if(Nr[a]==Nr[b]) Nr[b]++;
}
bool ok(int a, int b){
    return Find(a)==Find(b);
}
int Find(int a){int v;
    for(v=a;T[v]!=v;v=T[v]);

   for(;T[a]!=a;){
    int y=T[a];
    T[a]=v;
    a=y;
   }
   return v;
}