Pagini recente » Cod sursa (job #3197172) | Cod sursa (job #2619144) | Cod sursa (job #2839801) | Cod sursa (job #2928622) | Cod sursa (job #2936135)
//Complexitate: - timp: O(log n) atat pentru o operatie de tip 1, cat si pentru o operatie de tip 2
// se fac m operatii de tipul 1 sau 2 => O(m*log n)
// - memorie: O(n)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
vector<int>tata(100001);
vector<int>rang(100001);
int n, m, operatie, x, y;
int reprezentant(int nod){ //reprezinta radacina unei componente conexe
while(tata[nod] != nod){
nod=tata[nod];
}
return nod;
}
void reuniune(int x, int y){
int reprezentant_x = reprezentant(x), reprezentant_y = reprezentant(y);
if(rang[reprezentant_x] < rang[reprezentant_y])
tata[reprezentant_x] = reprezentant_y;
else{
//leg reprezentantul lui y direct de reprezentantul lui x(radacina componentei conexe care l contine pe x)
tata[reprezentant_y] = reprezentant_x;
if(rang[reprezentant_x] == rang[reprezentant_y])
rang[reprezentant_y]++;
}
}
int main() {
fin>>n>>m;
for(int i=1; i<=n; i++)
tata[i]=i, rang[i]=1;
for(int i=0; i<m; i++){
fin>>operatie>>x>>y;
if(operatie==1)
reuniune(x, y);
else{
if(reprezentant(x) == reprezentant(y)) fout << "DA\n";
else fout<<"NU\n";
}
}
return 0;
}