Pagini recente » Diferente pentru utilizator/oldatlantian intre reviziile 73 si 25 | Rezultatele filtrării | Borderou de evaluare (job #638885) | Diferente pentru probleme-de-acoperire-2 intre reviziile 51 si 53 | Cod sursa (job #1314560)
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
vector<int> RANK, LEADER;
int n, Q;
int Find(int v) {
if(LEADER[v] == 0) return v;
else return Find(LEADER[v]);
}
void Union (int r1, int r2) {
if(RANK[r1] < RANK[r2]) {
LEADER[r1] = r2;
} else if(RANK[r1] > RANK[r2]) {
LEADER[r2] = r1;
} else {
LEADER[r1] = r2;
RANK[r2] ++;
}
}
int main() {
fin>>n>>Q;
RANK.resize(n+1, 0);
LEADER.resize(n+1, 0);
int type; int a, b;
for(int i=1; i<=Q; i++) {
fin>>type>>a>>b;
if(type == 1) {
Union(Find(a), Find(b));
}
else {
fout<< ((Find(a) == Find(b))?"DA":"NU") <<'\n';
}
}
}