---
# System prepended metadata

title: Matematical Transformation - Solución
tags: [Soluciones]

---

# Matematical Transformation - Solución

https://codeforces.com/gym/103577/problem/G

Dado un árbol ernaizado en el nodo $1$ donde el valor inicial de cada nodo es $0$, procesar $Q$ queries, las cuales pueden ser de dos tipos:

1. Dado un nodo $u$ y dos valores $k$ y $c$, sumar $d_{u,v}*k+c$ a todos los nodos $v$ en el subarbol de $u$, donde $d_{u,v}$ es la distancia de $u$ a $v$.
2. Dado dos nodos $u$ y $v$ imprimir la suma de los valores en el camino de $u$ a $v$.

## Solución
Definamos a $sum_u$ como la suma de los valores de los nodos en el camino de $u$ a la raíz. La respuesta de una query del tipo $2$ se puede expresar como $sum_u+sum_v-sum_{lca(u,v)}-sum_{p[lca(u,v)]}$, donde $lca(u,v)$ es el Lowest Common Ancester de $u$ y $v$, y $p[u]$ es el padre $u$ en el árbol.

Veamos cómo se modifica el valor de $sum_v$ en la query $1$, para un nodo $v$ en el subarbol de $u$. Observemos que se debe sumar el siguiente valor a $sum_v$:

$$
\sum_{a \in path(u,v)}(d_{u,a}*k+c)=\sum_{a}(d_{u,a}*k)+\sum_{a}c 
$$
$$
= (\sum_{a}d_{u,a}*k)+(d_{u,v}+1)*c
$$

Notemos que $d_{u,v}=p_v-p_u$, donde $p_u$ es la profundidad del nodo $u$, por lo tanto:

$$
(\sum_{a}d_{u,a}*k)+(d_{u,v}+1)c=(\sum_{a}(p_a-p_u)k)+(p_v-p_u+1)c
$$
$$
= k(\sum_a p_a - \sum_a p_u) + (p_v - p_u + 1)c
$$
$$
= k(\sum_a p_a - (p_v - p_u + 1) p_u) + (p_v - p_u + 1) c
$$
$$
= (k\sum_a p_a) + (p_v - p_u + 1)(c-p_uk)
$$

Notar que en $\sum_a p_a$ estamos sumando todas las profundidades desde $p_u$ hasta $p_v$, por lo tanto:

$$
= (k\sum_{i=p_u}^{p_v} i) + (p_v - p_u + 1)(c-p_u k)
$$
$$
= (k(\frac{p_v(p_v+1)-p_u(p_u-1)}{2})) + (p_v - p_u + 1)(c-p_uk)
$$

Finalmente, desarrollemos toda la expresión y agrupemos los términos por el explonente de $p_v$:

$$
= \frac{k}{2}p_v^2 + (\frac{k}{2}-p_uk+c)p_v + (\frac{k}{2}p_u(p_u-1)+c(1-p_u))
$$

Podemos observar que $sum_v$ se puede expresar de la forma $A_vp_v^2+B_vp_v+C_v$. Los valores de $p_v^2$ y $p_v$ nunca se modifican durante las queries, ya que dependen sólo de la profundidad del nodo $u$. Por lo tanto, mantendremos los valores de $A_v$, $B_v$ y $C_v$, y los utilizaremos cuando querramos encontrar el valor de $sum_v$.

Ahora, la query $1$ consiste en sumar:

* $A_v += \frac{k}{2}$
* $B_v += \frac{k}{2}-p_uk+c$
* $C_v += \frac{k}{2}p_u(p_u-1)+c(1-p_u)$

en todos los nodos $v$ en el subarbol de $u$.

Podemos utilizar la técnica de aplanamiento de un árbol y un Fenwick Tree o Segment Tree para actualizar todos los valores de $A_v$, $B_v$ y $C_v$ en el subárbol de $u$.

Para evitar problemas de precisión cuando tenemos términos con $k/2$, se pueden multiplicar por $2$ los términos que se suma y al contestar la query se divide entre $2$.

Complejidad: $O(nlogn)$.