fa[y] = 0; top[y] = query(1, 1, n, dfn[y]).top; top[x] = query(1, 1, n, dfn[x]).top; // 更新 top if(top[y] != y){ modify(1, 1, n, dfn[y], dfn[y] + dep[tail[top[y]]] - dep[y], y); // 修改 y 所在重链 top top[y] = y; tail[top[y]] = tail[top[x]]; tail[top[x]] = x; } siz[y] = query(1, 1, n, dfn[y]).siz; // 更新 siz while(x){ top[x] = query(1, 1, n, dfn[x]).top; mul(1, 1, n, dfn[top[x]], dfn[x], -siz[y]); // 修改 x 到根的 siz x = fa[top[x]]; }
查询
1 2 3 4 5 6 7 8 9 10 11
siz[y] = query(1, 1, n, dfn[y]).siz; top[x] = query(1, 1, n, dfn[x]).top; // 更新 siz 和 top while(fa[top[x]]){ x = fa[top[x]]; top[x] = query(1, 1, n, dfn[x]).top;; } x = top[x]; // x 跳到根 siz[x] = query(1, 1, n, dfn[x]).siz; ans[i] = 1LL * siz[y] * (siz[x] - siz[y]); //注意 long long