Pagini recente » Cod sursa (job #1852624) | Cod sursa (job #2537924) | Cod sursa (job #446928) | Cod sursa (job #273388) | Cod sursa (job #2763674)
#include <iostream>
#include <fstream>
#define NMAX 100000 //o suta de mii
using namespace std;
ifstream fin ("disjoint.in");
ofstream fout ("disjoint.out");
int tt[NMAX + 1];
int RG[NMAX + 1];
int find(int x){
int copie = x;
while(tt[x] != x){
x = tt[x];
}
int radacina = x;
//scurtez drumul
x = copie;
while(x != tt[x]){
int aux = tt[x];
tt[x] = radacina;
x = aux;
}
return radacina;
}
void unite(int A, int B){
if(RG[A] > RG[B]){
tt[B] = A;
}
else {
tt[A] = B; //si la egalitate se intampla asta!
}
if(RG[A] == RG[B]){
//daca aveau rangurile egale, si s-a intamplat TT[A] = B, cresc rangul lui B
RG[B]++;
}
}
int main()
{
int N, M;
fin >> N >> M;
for(int i = 1; i <= N; i++){
tt[i] = i;
}
for(int i = 1; i <= M; i++){
int tip, a, b;
fin >> tip >> a >> b;
if(tip == 1){
unite( find(a), find(b) );
}
else {
if(find(a) == find(b)){
fout << "DA\n";
}
else {
fout << "NU\n";
}
}
}
return 0;
}