Pagini recente » Cod sursa (job #452922) | Cod sursa (job #2147020) | Cod sursa (job #2048034) | Cod sursa (job #862313) | Cod sursa (job #2935031)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
//Complexitate: O(log*N) pentru o operatie de tipul 2 si O(1) pentru o operatie de tipul 1.
vector<int> parinte, inaltime;
int radacina(int node){
int start = node;
while(parinte[node] != 0){
node = parinte[node];
}
while(start != node){
int urm = parinte[start];
parinte[start] = node;
start = urm;
}
return node;
}
void uneste(int nodx, int nody){
int parintex = radacina(nodx), parintey = radacina(nody);
if(parintex == parintey)
return;
if(inaltime[parintex] > inaltime[parintey]){
parinte[parintey] = parintex;
}
else if(inaltime[parintex] < inaltime[parintey]) {
parinte[parintex] = parintey;
}
else {
parinte[parintey] = parintex;
inaltime[parintex] ++;
}
}
int main(){
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
ios::sync_with_stdio(false);
fin.tie(nullptr);
fout.tie(nullptr);
int n, m;
fin >> n >> m;
parinte.resize(n+2,0);
inaltime.resize(n+2,0);
for(int i = 1; i <= m; ++i) {
int op, x, y;
fin >> op >> x >> y;
if(op == 1)
uneste(x,y);
else {
int parintex = radacina(x), parintey = radacina(y);
if (parintex == parintey)
fout<<"DA\n";
else fout<<"NU\n";
}
}
return 0;
}