Pagini recente » preONI 2008 - Clasament general, Clasa a 10-a | Cod sursa (job #1153724) | Cod sursa (job #176225) | Cod sursa (job #410872) | Cod sursa (job #531346)
Cod sursa(job #531346)
#include<cstdio>
#include<vector>
using namespace std;
#define NMAX 100001
pair<int, int> sets[NMAX];
int N;
void initSets() {
for(int i = 1; i <= N; i++) {
pair <int, int> p;
p.first = 0;
p.second = 1;
sets[i] = p;
}
}
int getFather (int x) {
while (sets[x].first != 0) {
x = sets[x].first;
}
return x;
}
void updateFather(int x, int father) {
while (sets[x].first != 0) {
sets[x].first = father;
x = sets[x].first;
}
}
void merge(int x, int y) {
int a = getFather(x);
updateFather(x, a);
int b = getFather(y);
updateFather(y, b);
if (sets[a].second > sets[b].second) {
sets[b].first = a;
sets[a].second += sets[b].second;
}
else {
sets[a].first = b;
sets[b].second += sets[a].second;
}
}
void check(int a, int b) {
int fa, fb;
fa = getFather(a);
updateFather(a, fa);
fb = getFather(b);
updateFather(b, fb);
if (fa == fb) printf("DA\n");
else printf("NU\n");
}
int main() {
freopen("disjoint.in", "r", stdin);
freopen("disjoint.out", "w", stdout);
int M;
scanf("%d %d", &N, &M);
initSets();
int op, a, b;
for (int i = 0; i < M; i++) {
scanf("%d %d %d", &op, &a, &b);
if (op == 1) merge(a, b);
else check(a, b);
}
return 0;
}