我在写此题的时候,使用了如下方式进行最后查询:
for (int i{1};i<=n;++i) for (int j{LG};j>=1;--j) if (i+(1<<j)-1<=n) { merge(f[j-1],i,f[j][i]); merge(f[j-1],i+(1<<j-1),f[j][i]+(1<<j-1)); }
但是这样,如果某一个点所在的集合被大于它的点更新了,就不会下穿到0。
解决方法是merge时把祖先编号小的往祖先编号大的连边。
merge