建操作树,此时需要支持加边删边查询一个连通块的 kth。
加边删边用两个集合做启发式操作很好维护,考虑查一个连通块的 kth,通常的套路是二分,于是这道题如果加边时启发式合并、删边时启发式分裂、查询时二分,看上去是一个很自然的想法,但是复杂度并不对。令 \(nm\) 同阶,先用 \(\dfrac{m}{2}\) 合并出两个大小为 \(\dfrac{n}{4}\) 的集合,剩下 \(\dfrac{m}{2}\) 次操作一直反复对这两个集合合并、分裂。
这道题看上去很难带启发式分裂这种操作,考虑用可持久化并查集维护加边删边,但是这样就没法二分了,考虑我们刚才的启发式合并是在干什么,实际上就是维护两个桶然后对其做合并,这两个桶中的信息并非都有用,经典套路,对值域分块,求出 kth 在哪一块以后暴力枚举,因此我们在并查集上维护 \(O(\dfrac{n}{B})\) 个块中的出现次数(离散化),找到在哪一个块后暴力检查块中的数和 \(x\) 是否在同一个中,这样的复杂度是 \(O(mB\log n+\dfrac{nm}{B})\),瞎取一个 \(O(\sqrt{n})\) 看上去无法通过,可以二分一个块长,理论上取 \(\sqrt{\frac{nm}{n+m\log n}}\),时间复杂度 \(O(m\sqrt{m\log n})\),看上去可以通过,不过空间是 \(O(n\sqrt{n})\),无法通过。可以对于每个块分开处理,这样空间就是线性的了,但是注意此时需要预处理并查集合并时的根。线性做法不过就是将暴力检查是否在同一个块变成随机求,期望 \(O(m\sqrt{n})\)。
代码明天补,要是没补我就是傻逼。