```go
package main
import (
"bufio"
"fmt"
"os"
"sort"
)
func gcd(a, b int) int {
for b != 0 {
a, b = b, a%b
}
return a
}
func getDivisors(x int) []int {
var res []int
for i := 1; i*i <= x; i++ {
if x%i == 0 {
res = append(res, i)
if i*i != x {
res = append(res, x/i)
}
}
}
return res
}
func readInt(in *bufio.Reader) int {
n := 0
c, err := in.ReadByte()
for err == nil && c <= ' ' {
c, err = in.ReadByte()
}
for err == nil && c > ' ' {
n = n*10 + int(c-'0')
c, err = in.ReadByte()
}
return n
}
func readInt64(in *bufio.Reader) int64 {
var n int64 = 0
c, err := in.ReadByte()
for err == nil && c <= ' ' {
c, err = in.ReadByte()
}
for err == nil && c > ' ' {
n = n*10 + int64(c-'0')
c, err = in.ReadByte()
}
return n
}
type Item struct {
a, b int
c int64
}
type CostPair struct {
sum int
cost int64
}
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
n := readInt(in)
if n == 0 {
return
}
q := readInt(in)
a := make([]int, n)
for i := 0; i < n; i++ {
a[i] = readInt(in)
}
b := make([]int, n)
for i := 0; i < n; i++ {
b[i] = readInt(in)
}
c := make([]int64, n)
var W int64
for i := 0; i < n; i++ {
c[i] = readInt64(in)
W += c[i]
}
queries := make([]int64, q)
for i := 0; i < q; i++ {
queries[i] = readInt64(in)
}
items := make([]Item, n)
for i := 0; i < n; i++ {
items[i] = Item{a[i], b[i], c[i]}
}
sort.Slice(items, func(i, j int) bool {
if items[i].a != items[j].a {
return items[i].a < items[j].a
}
return items[i].b < items[j].b
})
var uniqueItems []Item
for i := 0; i < n; i++ {
if i == 0 || items[i].a != items[i-1].a || items[i].b != items[i-1].b {
uniqueItems = append(uniqueItems, items[i])
} else {
uniqueItems[len(uniqueItems)-1].c += items[i].c
}
}
divsA := getDivisors(a[0])
divsB := getDivisors(b[0])
set := make(map[int]bool)
for _, x := range divsA {
set[x] = true
}
for _, x := range divsB {
set[x] = true
}
var S []int
for x := range set {
S = append(S, x)
}
sort.Ints(S)
var V []int
for _, x := range S {
valid := true
for _, item := range uniqueItems {
if item.a%x != 0 && item.b%x != 0 {
valid = false
break
}
}
if valid {
V = append(V, x)
}
}
reqArr := make([]int, len(V))
for j, ga := range V {
req := 0
for _, item := range uniqueItems {
if item.a%ga != 0 {
req = gcd(req, item.a)
} else if item.b%ga != 0 {
req = gcd(req, item.b)
}
if req == 1 {
break
}
}
reqArr[j] = req
}
H := make([][]int64, len(V))
for i := range H {
H[i] = make([]int64, len(V))
}
for _, item := range uniqueItems {
var divA []int
for j, ga := range V {
if item.a%ga == 0 {
divA = append(divA, j)
}
}
var divB []int
for j, gb := range V {
if item.b%gb == 0 {
divB = append(divB, j)
}
}
for _, ga := range divA {
for _, gb := range divB {
H[ga][gb] += item.c
}
}
}
var validPairs []CostPair
for i, ga := range V {
req := reqArr[i]
for j, gb := range V {
if req%gb == 0 {
validPairs = append(validPairs, CostPair{
sum: ga + gb,
cost: W - H[i][j],
})
}
}
}
sort.Slice(validPairs, func(i, j int) bool {
return validPairs[i].cost < validPairs[j].cost
})
maxSum := 0
for i := range validPairs {
if validPairs[i].sum > maxSum {
maxSum = validPairs[i].sum
}
validPairs[i].sum = maxSum
}
for i := 0; i < q; i++ {
d := queries[i]
l, r := 0, len(validPairs)-1
ans := 0
for l <= r {
mid := (l + r) / 2
if validPairs[mid].cost <= d {
ans = validPairs[mid].sum
l = mid + 1
} else {
r = mid - 1
}
}
if i > 0 {
fmt.Fprint(out, " ")
}
fmt.Fprint(out, ans)
}
fmt.Fprintln(out)
}
```