voidall0(){ sum = 0; s = {}; } voidall1(){ sum = calc(n); s = {{1, n}}; }
voidadd(int x){ auto it = s.lower_bound({x, 0}); int l = x, r = x; if (it != s.begin()) { auto itl = std::prev(it); auto [l1, r1] = *itl; if (r1 + 1 == x) { sum -= calc(r1 - l1 + 1); s.erase(itl); l = l1; } } if (it != s.end()) { auto [l2, r2] = *it; if (l2 - 1 == x) { sum -= calc(r2 - l2 + 1); s.erase(it); r = r2; } } sum += calc(r - l + 1); s.insert({l, r}); }
voiddec(int x){ auto it = -- s.lower_bound({x + 1, 0}); auto [l, r] = *it;
sum -= calc(r - l + 1); s.erase(it); if (x > l) { sum += calc(x - l); s.insert({l, x - 1}); } if (x < r) { sum += calc(r - x); s.insert({x + 1, r}); } } } si, so;
int sze[N], son[N];
voiddfs_init(int u, int fu){ sze[u] = 1, son[u] = 0; for (int v : G[u]) { if (v == fu) { continue; } dfs_init(v, u); sze[u] += sze[v]; if (sze[v] > sze[son[u]]) { son[u] = v; } } }
i64 ans;
voidadd(int x){ si.add(x), so.dec(x); } voidaddTree(int u, int fu){ add(u); for (int v : G[u]) { if (v == fu) { continue; } addTree(v, u); } }
voidsolve(int u, int fu, bool save){ for (int v : G[u]) { if (v == fu || v == son[u]) { continue; } solve(v, u, 0); } if (son[u]) { solve(son[u], u, 1); }
for (int v : G[u]) { if (v == fu || v == son[u]) { continue; } addTree(v, u); } add(u);
if (u > 1) { ans += 1ll * n * (n + 1) / 2 - si.sum - so.sum; }