11#pragma once
2- #include " ../../../kactl/content/data-structures/UnionFind.h "
2+ #include " dsu.hpp "
33// ! Given l1,l2,len; joins (l1,l2), (l1+1,l2+1),
44// ! ..., (l1+len-1,l2+len-1)
55// ! `f` is called at most n-1 times
66// ! @time O(n*log(n)*\alpha(n) + q)
77// ! @space O(n log n)
88struct rp_dsu {
9- vector<UF> ufs ;
10- rp_dsu (int n): ufs (bit_width(unsigned (n)), UF (n)) {}
9+ vector<DSU> dsus ;
10+ rp_dsu (int n): dsus (bit_width(unsigned (n)), DSU (n)) {}
1111 void join (int l1, int l2, int len, const auto & f) {
1212 if (len == 0 ) return ;
1313 int lg = __lg (len);
@@ -17,13 +17,13 @@ struct rp_dsu {
1717 }
1818 void join_impl (int lvl, int u, int v, const auto & f) {
1919 if (lvl == 0 ) {
20- u = ufs [0 ].find (u);
21- v = ufs [0 ].find (v);
22- if (!ufs [0 ].join (v, u)) return ;
23- int w = ufs [0 ].find (u);
20+ u = dsus [0 ].f (u);
21+ v = dsus [0 ].f (v);
22+ if (!dsus [0 ].join (v, u)) return ;
23+ int w = dsus [0 ].f (u);
2424 return f (w, u ^ v ^ w);
2525 }
26- if (!ufs [lvl].join (u, v)) return ;
26+ if (!dsus [lvl].join (u, v)) return ;
2727 join_impl (lvl - 1 , u, v, f);
2828 join_impl (lvl - 1 , u + (1 << (lvl - 1 )),
2929 v + (1 << (lvl - 1 )), f);
0 commit comments