¿Alguien puede ayudarme a resolver el problema SPOJ “Consulta en un árbol” (QTREE)?

Este problema puede resolverse mediante la descomposición con mucha luz.

En primer lugar, aquí hay una introducción a la descomposición de luz pesada. La idea esencial para QTREE es mantener un árbol de segmentos para almacenar distancias a lo largo de todos los caminos pesados ​​del árbol. De esa manera, la consulta y la actualización de los pesos máximos de borde a lo largo de rutas pesadas se pueden hacer en tiempo O (log N). La solución del problema se puede dividir en tres pasos:

1. Cálculo inicial:

  • Rootea el árbol en cualquier vértice. Encuentra los bordes pesados ​​y los caminos pesados ​​en el árbol usando un dfs
  • Cree un árbol de segmentos para almacenar las longitudes máximas de borde para intervalos a lo largo de caminos pesados. Normalmente hago esto usando un segundo dfs

2. Consulta:

  • Dados los vértices u y v, encuentre w = ancestro común más bajo (u, v) usando saltos de bordes pesados ​​o almacenando el 2º padre para cada vértice (prefiero el último de alguna manera).
  • maxedge (uv) = max (maxedge (uw), maxedge (vw)). Como w es un antepasado de u y v, se puede calcular maxedge (u / vw) utilizando la descomposición de luz intensa en O (log² N)

3. Actualización:

  • Si uv es un borde ligero, solo actualice su peso
  • Si uv es un borde pesado, actualice el árbol de segmentos correspondiente a su ruta.

El cálculo inicial se puede hacer en O (N log N). Cada consulta toma O (log² N) y la actualización toma O (log N). Por lo tanto, la complejidad de la solución es O (N log N + Q log² N).