← Home
For problem statement at 1000-1999/1300-1399/1380-1389/1389/problemG.txt this is a correct solution, but verifier at 1000-1999/1300-1399/1380-1389/1389/verifierG.go ends with panic: invalid argument to Intn

goroutine 1 [running]:
math/rand.(*Rand).Intn(0x0?, 0xe?)
	/usr/local/go/src/math/rand/rand.go:180 +0x64
main.genTest(0x400006ce90)
	/home/ubuntu/codeforces/1000-1999/1300-1399/1380-1389/1389/verifierG.go:147 +0x60
main.main()
	/home/ubuntu/codeforces/1000-1999/1300-1399/1380-1389/1389/verifierG.go:222 +0x180
exit status 2 can you fix the verifier? ```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var n, m, k int
	if _, err := fmt.Fscanf(reader, "%d %d %d\n", &n, &m, &k); err != nil {
		return
	}

	special := make([]int, k)
	for i := 0; i < k; i++ {
		fmt.Fscanf(reader, "%d", &special[i])
	}
	fmt.Fscanf(reader, "\n")

	c := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		fmt.Fscanf(reader, "%d", &c[i])
	}
	fmt.Fscanf(reader, "\n")

	w := make([]int64, m+1)
	for i := 1; i <= m; i++ {
		fmt.Fscanf(reader, "%d", &w[i])
	}
	fmt.Fscanf(reader, "\n")

	type Edge struct {
		to, id int
	}
	adj := make([][]Edge, n+1)
	for i := 1; i <= m; i++ {
		var u, v int
		fmt.Fscanf(reader, "%d %d\n", &u, &v)
		adj[u] = append(adj[u], Edge{v, i})
		adj[v] = append(adj[v], Edge{u, i})
	}

	dfn := make([]int, n+1)
	low := make([]int, n+1)
	st := make([]int, 0)
	inSt := make([]bool, n+1)
	timer := 0
	scc := make([]int, n+1)
	sccCnt := 0

	var tarjan func(u, p int)
	tarjan = func(u, p int) {
		timer++
		dfn[u] = timer
		low[u] = timer
		st = append(st, u)
		inSt[u] = true
		for _, e := range adj[u] {
			if e.to == p {
				continue
			}
			if dfn[e.to] != 0 {
				if inSt[e.to] && dfn[e.to] < low[u] {
					low[u] = dfn[e.to]
				}
			} else {
				tarjan(e.to, u)
				if low[e.to] < low[u] {
					low[u] = low[e.to]
				}
			}
		}
		if low[u] == dfn[u] {
			sccCnt++
			for {
				v := st[len(st)-1]
				st = st[:len(st)-1]
				inSt[v] = false
				scc[v] = sccCnt
				if v == u {
					break
				}
			}
		}
	}
	tarjan(1, 0)

	treeC := make([]int64, sccCnt+1)
	for i := 1; i <= n; i++ {
		treeC[scc[i]] += c[i]
	}

	type TreeEdge struct {
		to int
		w  int64
	}
	tree := make([][]TreeEdge, sccCnt+1)
	for u := 1; u <= n; u++ {
		for _, e := range adj[u] {
			if scc[u] != scc[e.to] {
				tree[scc[u]] = append(tree[scc[u]], TreeEdge{scc[e.to], w[e.id]})
			}
		}
	}

	dpDown := make([]int64, sccCnt+1)
	var dfsDown func(u, p int)
	dfsDown = func(u, p int) {
		dpDown[u] = treeC[u]
		for _, e := range tree[u] {
			if e.to == p {
				continue
			}
			dfsDown(e.to, u)
			val := dpDown[e.to] - e.w
			if val > 0 {
				dpDown[u] += val
			}
		}
	}
	dfsDown(1, 0)

	dpUp := make([]int64, sccCnt+1)
	var dfsUp func(u, p int, upVal int64)
	dfsUp = func(u, p int, upVal int64) {
		dpUp[u] = upVal
		for _, e := range tree[u] {
			if e.to == p {
				continue
			}
			curVal := dpDown[u]
			if dpDown[e.to]-e.w > 0 {
				curVal -= (dpDown[e.to] - e.w)
			}
			if upVal-0 > 0 {
				curVal += upVal
			}
			nextUp := curVal - e.w
			if nextUp < 0 {
				nextUp = 0
			}
			dfsUp(e.to, u, nextUp)
		}
	}
	dfsUp(1, 0, 0)

	ans := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		u := scc[i]
		ans[i] = dpDown[u] + dpUp[u]
	}

	for i := 1; i <= n; i++ {
		if i > 1 {
			fmt.Fprint(writer, " ")
		}
		fmt.Fprint(writer, ans[i])
	}
	fmt.Fprintln(writer)
}
```