Editorial for UTS Open '18 P7 - Gossip Network
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Subtask 1
Each time a piece of news is announced, perform a DFS to update the total interest value heard by each person. This allows you to answer type-2 queries in .
Time Complexity: 
Subtask 2
Use a BIT-like data structure, where left[] is the sum of the interest values heard by student 
 for any news originating from the 
 students to the left of 
, where 
 denotes the largest power of 
 dividing 
 (this is 
i&-i in C++). Construct a second BIT with right instead of left, then we can update and query in  time.
Time Complexity: 
Subtask 3
Perform centroid decomposition on the tree. For each student, store the sum of the interest values of any news they heard that originated from a descendant in the centroid tree. This takes  per type-1 query, since news starting at 
 only requires updating the ancestors of 
 in the centroid tree (there are at most 
 ancestors, and the product of popularities along a path can be calculated in 
 using LCA's. Type-2 queries can be answered in 
, by adding up the stored sum of products (multiplied by the product of popularities on the path to 
) for all ancestors of 
 in the centroid tree, and subtracting any products that were counted multiple times.
Time Complexity: 
Comments
Queries are solvable in
 time by storing additional information in your centroid decomposition:
Centroid -> Amount of interest attained from each subtree
Children of centroid -> Total product in the path to the centroid, index of the subtree that the node is in