← Home
For problem statement at 1000-1999/1700-1799/1760-1769/1763/problemF.txt this is a correct solution, but verifier at 1000-1999/1700-1799/1760-1769/1763/verifierF.go ends with All tests passed can you fix the verifier? package main

import (
	"io"
	"os"
	"strconv"
)

type Frame struct {
	u   int
	idx int
}

type Block struct {
	start int
	end   int
	edges int
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	p := 0
	nextInt := func() int {
		for p < len(data) && (data[p] < '0' || data[p] > '9') {
			p++
		}
		x := 0
		for p < len(data) && data[p] >= '0' && data[p] <= '9' {
			x = x*10 + int(data[p]-'0')
			p++
		}
		return x
	}

	n := nextInt()
	m := nextInt()

	uEdge := make([]int, m)
	vEdge := make([]int, m)
	adj := make([][]int, n+1)

	for i := 0; i < m; i++ {
		u := nextInt()
		v := nextInt()
		uEdge[i] = u
		vEdge[i] = v
		adj[u] = append(adj[u], i)
		adj[v] = append(adj[v], i)
	}

	tin := make([]int, n+1)
	low := make([]int, n+1)
	parent := make([]int, n+1)
	parentEdge := make([]int, n+1)
	for i := 1; i <= n; i++ {
		parentEdge[i] = -1
	}

	mark := make([]int, n+1)
	stamp := 0
	allVerts := make([]int, 0, n)
	blocks := make([]Block, 0)
	bridgeU := make([]int, 0)
	bridgeV := make([]int, 0)
	edgeStack := make([]int, 0, m)
	frames := make([]Frame, 0, n)
	timer := 0

	processComp := func(stopEdge int) {
		stamp++
		start := len(allVerts)
		edgeCount := 0
		lastE := -1
		for len(edgeStack) > 0 {
			e := edgeStack[len(edgeStack)-1]
			edgeStack = edgeStack[:len(edgeStack)-1]
			lastE = e
			edgeCount++
			a := uEdge[e]
			b := vEdge[e]
			if mark[a] != stamp {
				mark[a] = stamp
				allVerts = append(allVerts, a)
			}
			if mark[b] != stamp {
				mark[b] = stamp
				allVerts = append(allVerts, b)
			}
			if e == stopEdge {
				break
			}
		}
		if edgeCount == 1 {
			bridgeU = append(bridgeU, uEdge[lastE])
			bridgeV = append(bridgeV, vEdge[lastE])
			allVerts = allVerts[:start]
		} else if edgeCount > 1 {
			blocks = append(blocks, Block{start: start, end: len(allVerts), edges: edgeCount})
		}
	}

	for s := 1; s <= n; s++ {
		if tin[s] != 0 {
			continue
		}
		timer++
		tin[s] = timer
		low[s] = timer
		parent[s] = 0
		parentEdge[s] = -1
		frames = append(frames, Frame{u: s, idx: 0})

		for len(frames) > 0 {
			top := len(frames) - 1
			u := frames[top].u
			if frames[top].idx < len(adj[u]) {
				eid := adj[u][frames[top].idx]
				frames[top].idx++
				v := uEdge[eid]
				if v == u {
					v = vEdge[eid]
				}
				if tin[v] == 0 {
					edgeStack = append(edgeStack, eid)
					parent[v] = u
					parentEdge[v] = eid
					timer++
					tin[v] = timer
					low[v] = timer
					frames = append(frames, Frame{u: v, idx: 0})
				} else if eid != parentEdge[u] && tin[v] < tin[u] {
					edgeStack = append(edgeStack, eid)
					if low[u] > tin[v] {
						low[u] = tin[v]
					}
				}
			} else {
				frames = frames[:top]
				if parent[u] != 0 {
					pu := parent[u]
					if low[pu] > low[u] {
						low[pu] = low[u]
					}
					if low[u] >= tin[pu] {
						processComp(parentEdge[u])
					}
				}
			}
		}

		if len(edgeStack) > 0 {
			processComp(-1)
		}
	}

	numBlocks := len(blocks)
	totalNodes := n + numBlocks

	tree := make([][]int, totalNodes+1)
	weight := make([]int64, totalNodes+1)

	for i, b := range blocks {
		id := n + i + 1
		weight[id] = int64(b.edges)
		for j := b.start; j < b.end; j++ {
			v := allVerts[j]
			tree[id] = append(tree[id], v)
			tree[v] = append(tree[v], id)
		}
	}

	for i := 0; i < len(bridgeU); i++ {
		u := bridgeU[i]
		v := bridgeV[i]
		tree[u] = append(tree[u], v)
		tree[v] = append(tree[v], u)
	}

	log := 1
	for (1 << log) <= totalNodes {
		log++
	}

	up := make([][]int, log)
	for i := 0; i < log; i++ {
		up[i] = make([]int, totalNodes+1)
	}
	depth := make([]int, totalNodes+1)
	pref := make([]int64, totalNodes+1)
	vis := make([]bool, totalNodes+1)

	stack := make([]int, 0, totalNodes)
	stack = append(stack, 1)
	vis[1] = true
	up[0][1] = 1
	pref[1] = weight[1]

	for len(stack) > 0 {
		u := stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		for _, v := range tree[u] {
			if vis[v] {
				continue
			}
			vis[v] = true
			up[0][v] = u
			depth[v] = depth[u] + 1
			pref[v] = pref[u] + weight[v]
			stack = append(stack, v)
		}
	}

	for k := 1; k < log; k++ {
		prev := up[k-1]
		cur := up[k]
		for v := 1; v <= totalNodes; v++ {
			cur[v] = prev[prev[v]]
		}
	}

	lca := func(a, b int) int {
		u, v := a, b
		if depth[u] < depth[v] {
			u, v = v, u
		}
		diff := depth[u] - depth[v]
		bit := 0
		for diff > 0 {
			if diff&1 == 1 {
				u = up[bit][u]
			}
			diff >>= 1
			bit++
		}
		if u == v {
			return u
		}
		for k := log - 1; k >= 0; k-- {
			if up[k][u] != up[k][v] {
				u = up[k][u]
				v = up[k][v]
			}
		}
		return up[0][u]
	}

	q := nextInt()
	out := make([]byte, 0, q*8)
	for i := 0; i < q; i++ {
		a := nextInt()
		b := nextInt()
		l := lca(a, b)
		ans := pref[a] + pref[b] - 2*pref[l] + weight[l]
		out = strconv.AppendInt(out, ans, 10)
		out = append(out, '\n')
	}

	os.Stdout.Write(out)
}