← Home
For problem statement at 0-999/600-699/630-639/633/problemG.txt this is a correct solution, but verifier at 0-999/600-699/630-639/633/verifierG.go ends with All tests passed can you fix the verifier? ```go
package main

import (
	"io"
	"math/bits"
	"os"
	"strconv"
)

const MaxWords = 16

type FastScanner struct {
	data []byte
	idx  int
}

func (fs *FastScanner) NextInt() int {
	n := len(fs.data)
	i := fs.idx
	for i < n && (fs.data[i] < '0' || fs.data[i] > '9') {
		i++
	}
	val := 0
	for i < n && fs.data[i] >= '0' && fs.data[i] <= '9' {
		val = val*10 + int(fs.data[i]-'0')
		i++
	}
	fs.idx = i
	return val
}

var (
	m        int
	W        int
	lastMask uint64
	seg      [][MaxWords]uint64
	lazy     []int
	flat     []int
	primeMask [MaxWords]uint64
)

func rotateArr(a *[MaxWords]uint64, d int) {
	if m == 1 {
		return
	}
	d %= m
	if d == 0 {
		return
	}
	var left, right [MaxWords]uint64

	lws := d >> 6
	lbs := uint(d & 63)
	if lbs == 0 {
		for i := W - 1; i >= 0; i-- {
			j := i - lws
			if j >= 0 {
				left[i] = a[j]
			}
		}
	} else {
		sh := 64 - lbs
		for i := W - 1; i >= 0; i-- {
			j := i - lws
			if j >= 0 {
				v := a[j] << lbs
				if j > 0 {
					v |= a[j-1] >> sh
				}
				left[i] = v
			}
		}
	}

	r := m - d
	rws := r >> 6
	rbs := uint(r & 63)
	if rbs == 0 {
		for i := 0; i < W; i++ {
			j := i + rws
			if j < W {
				right[i] = a[j]
			}
		}
	} else {
		sh := 64 - rbs
		for i := 0; i < W; i++ {
			j := i + rws
			if j < W {
				v := a[j] >> rbs
				if j+1 < W {
					v |= a[j+1] << sh
				}
				right[i] = v
			}
		}
	}

	for i := 0; i < W; i++ {
		a[i] = left[i] | right[i]
	}
	a[W-1] &= lastMask
}

func pull(idx int) {
	l := idx << 1
	r := l | 1
	for i := 0; i < W; i++ {
		seg[idx][i] = seg[l][i] | seg[r][i]
	}
}

func push(idx int) {
	d := lazy[idx]
	if d == 0 {
		return
	}
	l := idx << 1
	r := l | 1

	rotateArr(&seg[l], d)
	rotateArr(&seg[r], d)

	lazy[l] += d
	if lazy[l] >= m {
		lazy[l] -= m
	}
	lazy[r] += d
	if lazy[r] >= m {
		lazy[r] -= m
	}

	lazy[idx] = 0
}

func build(idx, l, r int) {
	if l == r {
		res := flat[l]
		seg[idx][res>>6] = uint64(1) << uint(res&63)
		return
	}
	mid := (l + r) >> 1
	build(idx<<1, l, mid)
	build(idx<<1|1, mid+1, r)
	pull(idx)
}

func update(idx, l, r, ql, qr, d int) {
	if ql <= l && r <= qr {
		rotateArr(&seg[idx], d)
		lazy[idx] += d
		if lazy[idx] >= m {
			lazy[idx] -= m
		}
		return
	}
	if lazy[idx] != 0 {
		push(idx)
	}
	mid := (l + r) >> 1
	if ql <= mid {
		update(idx<<1, l, mid, ql, qr, d)
	}
	if qr > mid {
		update(idx<<1|1, mid+1, r, ql, qr, d)
	}
	pull(idx)
}

func query(idx, l, r, ql, qr int, acc *[MaxWords]uint64) {
	if ql <= l && r <= qr {
		for i := 0; i < W; i++ {
			acc[i] |= seg[idx][i]
		}
		return
	}
	if lazy[idx] != 0 {
		push(idx)
	}
	mid := (l + r) >> 1
	if ql <= mid {
		query(idx<<1, l, mid, ql, qr, acc)
	}
	if qr > mid {
		query(idx<<1|1, mid+1, r, ql, qr, acc)
	}
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	fs := FastScanner{data: data}

	n := fs.NextInt()
	m = fs.NextInt()

	W = (m + 63) >> 6
	rem := m & 63
	if rem == 0 {
		lastMask = ^uint64(0)
	} else {
		lastMask = (uint64(1) << uint(rem)) - 1
	}

	val := make([]int, n+1)
	if m == 1 {
		for i := 1; i <= n; i++ {
			_ = fs.NextInt()
			val[i] = 0
		}
	} else {
		for i := 1; i <= n; i++ {
			val[i] = fs.NextInt() % m
		}
	}

	head := make([]int, n+1)
	for i := range head {
		head[i] = -1
	}
	to := make([]int, 2*(n-1))
	next := make([]int, 2*(n-1))
	ei := 0
	for i := 0; i < n-1; i++ {
		u := fs.NextInt()
		v := fs.NextInt()

		to[ei] = v
		next[ei] = head[u]
		head[u] = ei
		ei++

		to[ei] = u
		next[ei] = head[v]
		head[v] = ei
		ei++
	}

	parent := make([]int, n+1)
	order := make([]int, 0, n)
	stack := make([]int, 0, n)
	stack = append(stack, 1)
	parent[1] = 0

	for len(stack) > 0 {
		v := stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		order = append(order, v)
		for e := head[v]; e != -1; e = next[e] {
			u := to[e]
			if u == parent[v] {
				continue
			}
			parent[u] = v
			stack = append(stack, u)
		}
	}

	tin := make([]int, n+1)
	sz := make([]int, n+1)
	for i := 1; i <= n; i++ {
		sz[i] = 1
	}
	flat = make([]int, n)
	for i, v := range order {
		tin[v] = i
		flat[i] = val[v]
	}
	for i := len(order) - 1; i > 0; i-- {
		v := order[i]
		sz[parent[v]] += sz[v]
	}

	if m > 2 {
		isPrime := make([]bool, m)
		for i := 2; i < m; i++ {
			isPrime[i] = true
		}
		for i := 2; i*i < m; i++ {
			if isPrime[i] {
				for j := i * i; j < m; j += i {
					isPrime[j] = false
				}
			}
		}
		for i := 2; i < m; i++ {
			if isPrime[i] {
				primeMask[i>>6] |= uint64(1) << uint(i&63)
			}
		}
	}

	seg = make([][MaxWords]uint64, 4*n+5)
	lazy = make([]int, 4*n+5)
	build(1, 0, n-1)

	q := fs.NextInt()
	out := make([]byte, 0, q*4)

	for ; q > 0; q-- {
		typ := fs.NextInt()
		if typ == 1 {
			v := fs.NextInt()
			x := fs.NextInt()
			if m > 1 {
				d := x % m
				if d != 0 {
					l := tin[v]
					r := l + sz[v] - 1
					update(1, 0, n-1, l, r, d)
				}
			}
		} else {
			v := fs.NextInt()
			l := tin[v]
			r := l + sz[v] - 1
			var acc [MaxWords]uint64
			query(1, 0, n-1, l, r, &acc)
			cnt := 0
			for i := 0; i < W; i++ {
				cnt += bits.OnesCount64(acc[i] & primeMask[i])
			}
			out = strconv.AppendInt(out, int64(cnt), 10)
			out = append(out, '\n')
		}
	}

	_, _ = os.Stdout.Write(out)
}
```