首先我们考察一个环上咋做:

  1. 初始会将 \(s\) 相邻两个结点更新。
  2. 令相邻小的那边为正方向,那么先转一圈,然后再从大的那边转到终点。

我们令一个点 \(i\) 的 \(a_i\) 表示从长的那一边到短的那一边距离下降了多少,那么先仔细分析一下这个过程会发现圆方树上下面的点一定不会影响上面的点,而上面的点最多会影响两次下面的点(一次从距离长的那边下来,一次从距离短的那边下来,当然要分半边考虑,有的点不会被更新到),所以答案规模是 \(O(n^2)\) 的。

我们设 \(f_{i, j}\) 为点 \(i\) 目前出堆后距离下降 \(j\),在其子树内的次数,\(g_{i, j}\) 表示通过 \(i\) 与其父亲的边,父亲下降了 \(x\),子树内的次数。这两者唯一的区别是,经过环的影响,可能是会影响两次的(我们将一个环上所有点向其与父亲环的交点连边,连成一棵新树)。

那么发现转移是简单地,分 \(j\) 与 \(a_i\) 的关系看要不要更新两次即可,这玩意非常像一个区间和转移形式,不妨差分,就是复制前 \(a_i\) 项在前面拼接起来后然后相加,可以使用平衡树维护这一点,当然也有简单的长链剖分维护方法。