Pagini recente » Cod sursa (job #1510590) | Istoria paginii runda/sim3333 | Cod sursa (job #285802) | Cod sursa (job #1031608) | Cod sursa (job #2922057)
#include <fstream>
#include <iostream>
#include <vector>
#include <cassert>
#include <cstring>
#include <set>
#include <unordered_map>
#include <memory>
#include <deque>
#include <queue>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <sstream>
#include <bitset>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
void compress(int n, int p, vector<int>& parent) {
for (; n != p; ) {
int f = parent[n];
parent[n] = p;
n = f;
}
}
int getset(int n, vector<int>& parent) {
int p = n;
while (parent[p] != p)
p = parent[p];
return p;
}
bool unite(int a, int b, vector<int>& parent, vector<int>& height) {
int pa = getset(a, parent);
int pb = getset(b, parent);
if (pa == pb) {
compress(a, pa, parent);
compress(b, pb, parent);
return false;
}
if (height[pa] > height[pb]) {
swap(pa, pb);
swap(a, b);
}
parent[pa] = pb;
++height[pb];
compress(a, pb, parent);
compress(b, pb, parent);
return true;
}
int main() {
int N, M;
f >> N >> M;
vector<int> parent(N), height(N);
for (int i = 0; i < N; i++) {
parent[i] = i;
height[i] = 1;
}
for (int i = 0; i < M; i++) {
int op, a, b;
f >> op >> a >> b;
--a;
--b;
if (op == 1) {
assert(unite(a, b, parent, height));
} else {
int pa = getset(a, parent);
int pb = getset(b, parent);
compress(a, pa, parent);
compress(b, pb, parent);
g << (pa == pb ? "DA" : "NU") << '\n';
}
}
f.close();
g.close();
return 0;
}