Pagini recente » Cod sursa (job #99048) | Cod sursa (job #1755726) | Cod sursa (job #935109) | Cod sursa (job #1061584) | Cod sursa (job #2525978)
#include <bits/stdc++.h>
using namespace std;
#define NMAX 100001
int tati[NMAX];
int h[NMAX];
ifstream fin ("disjoint.in");
ofstream fout ("disjoint.out");
int Find(int x) {
int rad=x;
while(tati[rad]!=0)
rad = tati[rad];
// compresia
// cand trece face fiecare nod sa aiba radacina rad => face drumul de lungime 1 data viitoare
while(tati[x]) {
int tx=tati[x];
tati[x]=rad;
x=tx;
}
return rad;
}
void Union(int x, int y) {
int arx = Find(x), ary = Find(y);
if (arx == ary) return;
// facem inaltimea minima
// arx este mai mic => aceeasi inaltime maxima
// arx == ary => inaltime maxima +1
if (h[arx] <= h[ary])
tati[arx] = ary;
// ary este mai mare
else tati[ary] = arx;
}
int main() {
int cod,b,c,n,m;
fin>>n>>m;
for(int i=1; i<=m; i++) {
fin>>cod>>b>>c;
if(cod==1)
Union(b,c);
else if(cod==2) {
if(Find(b)==Find(c))
fout<<"DA"<<'\n';
else fout<<"NU"<<'\n';
}
}
return 0;
}