Use BIT (Fenwick tree) for efficient prefix sum queries and point updates. Pseudocode:
function dfs(v, parent):
tin[v] := timer
timer := timer + 1
for child in adj[v]:
if child != parent then
dfs(child, v)
tout[v] := timer
Complexity: build, per query.
Space complexity is for the data structures used.