Euler Tour

// subtree of u <-> range enter[u]..leave[u]
fn euler_tour(adj: &Vec<Vec<usize>>, root: usize) -> (Vec<usize>, Vec<usize>) {
    let n = adj.len();
    let mut t = 0;
    let mut enter = vec![!0; n]; // enter time
    let mut leave = vec![!0; n]; // leave time
    euler_dfs(root, !0, &mut t, &mut enter, &mut leave, adj);
    (enter, leave)
}

fn euler_dfs(
    u: usize,
    p: usize,
    t: &mut usize,
    enter: &mut Vec<usize>,
    leave: &mut Vec<usize>,
    adj: &Vec<Vec<usize>>,
) {
    enter[u] = *t;
    *t += 1;
    for &v in &adj[u] {
        if v != p {
            euler_dfs(v, u, t, enter, leave, adj);
        }
    }
    leave[u] = *t;
}

ABC406F