#include "../util.h" struct Union { vector a; Union(int n) : a(n, -1) {} int find(int i) { return a[i] < 0 ? i : a[i] = find(a[i]); } void join(int i, int j) { i = find(i), j = find(j); if (i == j) return; a[j] = i; } bool same(int i, int j) { return find(i) == find(j); } }; int n; Union un(0); void reset() { un = Union(n); } vector> edges; void do_step(int i) { auto [u, v] = edges[i]; un.join(u, v); } vector> queries; bool test(int i) { auto [u, v] = queries[i]; return un.same(u, v); } #include void stress_test() { for (int it = 0; it < 100'000; it++) { n = Random::integer(2, 31); int Q = Random::integer(2, 31); int MAX_OPERATIONS = n-1; edges.clear(); for (int i=1; i ans = pbs(Q, MAX_OPERATIONS); vector correct(Q, -1); Union un2(n); for (int j=0; j ans = pbs(Q, MAX_OPERATIONS); t.stop(); ll hash = accumulate(all(ans), 0LL); if (t.time > 700) cerr << "too slow: " << t.time << FAIL; cerr << "tested performance: " << t.time << "ms (hash: " << hash << ")" << endl; } int main() { stress_test(); performance_test(); }