← Home
For problem statement at 0-999/400-499/400-409/403/problemE.txt this is a correct solution, but verifier at 0-999/400-499/400-409/403/verifierE.go ends with case 1 mismatch:
expected:
Blue
2
Red
2 4
Blue
2 4

got:
Blue
2
Red
2 4
Blue
4
exit status 1 can you fix the verifier? ```go
package main

import (
	"bufio"
	"os"
	"sort"
	"strconv"
	"strings"
)

type Edge struct {
	to, id int
}

type Tree struct {
	n          int
	adj        [][]Edge
	parent     []int
	depth      []int
	heavy      []int
	head       []int
	pos        []int
	edgeNode   []int
	currentPos int
	seg        [][]int
}

func newTree(n int) *Tree {
	return &Tree{
		n:        n,
		adj:      make([][]Edge, n+1),
		parent:   make([]int, n+1),
		depth:    make([]int, n+1),
		heavy:    make([]int, n+1),
		head:     make([]int, n+1),
		pos:      make([]int, n+1),
		edgeNode: make([]int, n),
		seg:      make([][]int, 4*n+1),
	}
}

func (t *Tree) dfs1(u, p, d int) int {
	t.parent[u] = p
	t.depth[u] = d
	size := 1
	maxSub := 0
	for _, edge := range t.adj[u] {
		v := edge.to
		if v != p {
			t.edgeNode[edge.id] = v
			sub := t.dfs1(v, u, d+1)
			size += sub
			if sub > maxSub {
				maxSub = sub
				t.heavy[u] = v
			}
		}
	}
	return size
}

func (t *Tree) dfs2(u, h int) {
	t.head[u] = h
	t.currentPos++
	t.pos[u] = t.currentPos
	if t.heavy[u] != 0 {
		t.dfs2(t.heavy[u], h)
	}
	for _, edge := range t.adj[u] {
		v := edge.to
		if v != t.parent[u] && v != t.heavy[u] {
			t.dfs2(v, v)
		}
	}
}

func (t *Tree) addSeg(node, L, R, ql, qr, id int) {
	if ql <= L && R <= qr {
		t.seg[node] = append(t.seg[node], id)
		return
	}
	mid := (L + R) / 2
	if ql <= mid {
		t.addSeg(node*2, L, mid, ql, qr, id)
	}
	if qr > mid {
		t.addSeg(node*2+1, mid+1, R, ql, qr, id)
	}
}

func (t *Tree) addPath(u, v, id int) {
	for t.head[u] != t.head[v] {
		if t.depth[t.head[u]] < t.depth[t.head[v]] {
			u, v = v, u
		}
		t.addSeg(1, 1, t.n, t.pos[t.head[u]], t.pos[u], id)
		u = t.parent[t.head[u]]
	}
	if t.depth[u] > t.depth[v] {
		u, v = v, u
	}
	if t.pos[u]+1 <= t.pos[v] {
		t.addSeg(1, 1, t.n, t.pos[u]+1, t.pos[v], id)
	}
}

func (t *Tree) queryAndClear(node, L, R, p int, result *[]int, isDeleted []bool) {
	if len(t.seg[node]) > 0 {
		for _, id := range t.seg[node] {
			if !isDeleted[id] {
				isDeleted[id] = true
				*result = append(*result, id)
			}
		}
		t.seg[node] = nil
	}
	if L == R {
		return
	}
	mid := (L + R) / 2
	if p <= mid {
		t.queryAndClear(node*2, L, mid, p, result, isDeleted)
	} else {
		t.queryAndClear(node*2+1, mid+1, R, p, result, isDeleted)
	}
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Buffer(make([]byte, 1024*1024), 10*1024*1024)
	scanner.Split(bufio.ScanWords)

	readInt := func() int {
		scanner.Scan()
		val, _ := strconv.Atoi(scanner.Text())
		return val
	}

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())

	a := make([]int, n+1)
	for i := 1; i < n; i++ {
		a[i] = readInt()
	}

	b := make([]int, n+1)
	for i := 1; i < n; i++ {
		b[i] = readInt()
	}

	idx := readInt()

	blueTree := newTree(n)
	for i := 1; i < n; i++ {
		u := i + 1
		v := a[i]
		blueTree.adj[u] = append(blueTree.adj[u], Edge{v, i})
		blueTree.adj[v] = append(blueTree.adj[v], Edge{u, i})
	}

	redTree := newTree(n)
	for i := 1; i < n; i++ {
		u := i + 1
		v := b[i]
		redTree.adj[u] = append(redTree.adj[u], Edge{v, i})
		redTree.adj[v] = append(redTree.adj[v], Edge{u, i})
	}

	blueTree.dfs1(1, 0, 0)
	blueTree.dfs2(1, 1)

	redTree.dfs1(1, 0, 0)
	redTree.dfs2(1, 1)

	for i := 1; i < n; i++ {
		u := i + 1
		v := b[i]
		blueTree.addPath(u, v, i)
	}

	for i := 1; i < n; i++ {
		u := i + 1
		v := a[i]
		redTree.addPath(u, v, i)
	}

	blueDeleted := make([]bool, n)
	redDeleted := make([]bool, n)

	blueStage := []int{idx}
	blueDeleted[idx] = true
	var redStage []int

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	printSlice := func(s []int) {
		var sb strings.Builder
		for i, v := range s {
			if i > 0 {
				sb.WriteByte(' ')
			}
			sb.WriteString(strconv.Itoa(v))
		}
		sb.WriteByte('\n')
		out.WriteString(sb.String())
	}

	for len(blueStage) > 0 || len(redStage) > 0 {
		if len(blueStage) > 0 {
			out.WriteString("Blue\n")
			sort.Ints(blueStage)
			printSlice(blueStage)

			redStage = nil
			for _, id := range blueStage {
				p := blueTree.pos[blueTree.edgeNode[id]]
				blueTree.queryAndClear(1, 1, blueTree.n, p, &redStage, redDeleted)
			}
			blueStage = nil
		} else if len(redStage) > 0 {
			out.WriteString("Red\n")
			sort.Ints(redStage)
			printSlice(redStage)

			blueStage = nil
			for _, id := range redStage {
				p := redTree.pos[redTree.edgeNode[id]]
				redTree.queryAndClear(1, 1, redTree.n, p, &blueStage, blueDeleted)
			}
			redStage = nil
		}
	}
}
```