← Home
```go
package main

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

type pair struct {
	X, Y int64
}

type CostVal struct {
	cost int64
	val  int64
}

func gcd(a, b int64) int64 {
	for b != 0 {
		a, b = b, a%b
	}
	return a
}

func getDivisors(x int64) []int64 {
	var divs []int64
	for i := int64(1); i*i <= x; i++ {
		if x%i == 0 {
			divs = append(divs, i)
			if i*i != x {
				divs = append(divs, x/i)
			}
		}
	}
	return divs
}

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

	nextInt := func() int64 {
		scanner.Scan()
		var res int64
		b := scanner.Bytes()
		for _, v := range b {
			res = res*10 + int64(v-'0')
		}
		return res
	}

	if !scanner.Scan() {
		return
	}
	b := scanner.Bytes()
	var n int
	for _, v := range b {
		n = n*10 + int(v-'0')
	}

	q := int(nextInt())

	a := make([]int64, n)
	for i := 0; i < n; i++ {
		a[i] = nextInt()
	}
	bArr := make([]int64, n)
	for i := 0; i < n; i++ {
		bArr[i] = nextInt()
	}
	c := make([]int64, n)
	for i := 0; i < n; i++ {
		c[i] = nextInt()
	}

	dArr := make([]int64, q)
	for i := 0; i < q; i++ {
		dArr[i] = nextInt()
	}

	divA := getDivisors(a[0])
	divB := getDivisors(bArr[0])
	candsMap := make(map[int64]bool)
	for _, d := range divA {
		candsMap[d] = true
	}
	for _, d := range divB {
		candsMap[d] = true
	}
	var cands []int64
	for d := range candsMap {
		cands = append(cands, d)
	}

	L := (a[0] / gcd(a[0], bArr[0])) * bArr[0]

	uniquePairs := make(map[pair]int64)
	for i := 0; i < n; i++ {
		X := gcd(a[i], L)
		Y := gcd(bArr[i], L)
		uniquePairs[pair{X, Y}] += c[i]
	}

	var V []int64
	for _, g := range cands {
		ok := true
		for p := range uniquePairs {
			if p.X%g != 0 && p.Y%g != 0 {
				ok = false
				break
			}
		}
		if ok {
			V = append(V, g)
		}
	}
	M := len(V)

	uniqueX := make(map[int64]int64)
	uniqueY := make(map[int64]int64)
	for p, cost := range uniquePairs {
		uniqueX[p.X] += cost
		uniqueY[p.Y] += cost
	}

	var uniqueXKeys []int64
	for X := range uniqueX {
		uniqueXKeys = append(uniqueXKeys, X)
	}
	var uniqueYKeys []int64
	for Y := range uniqueY {
		uniqueYKeys = append(uniqueYKeys, Y)
	}

	BadX := make(map[int64][]int)
	for _, X := range uniqueXKeys {
		var bad []int
		for idx, g := range V {
			if X%g != 0 {
				bad = append(bad, idx)
			}
		}
		BadX[X] = bad
	}

	BadY := make(map[int64][]int)
	for _, Y := range uniqueYKeys {
		var bad []int
		for idx, g := range V {
			if Y%g != 0 {
				bad = append(bad, idx)
			}
		}
		BadY[Y] = bad
	}

	CostA := make([]int64, M)
	for _, X := range uniqueXKeys {
		cost := uniqueX[X]
		for _, u := range BadX[X] {
			CostA[u] += cost
		}
	}

	CostB := make([]int64, M)
	for _, Y := range uniqueYKeys {
		cost := uniqueY[Y]
		for _, v := range BadY[Y] {
			CostB[v] += cost
		}
	}

	bsize := (M + 63) / 64
	FailA := make([][]uint64, M)
	FailB := make([][]uint64, M)
	for i := 0; i < M; i++ {
		FailA[i] = make([]uint64, bsize)
		FailB[i] = make([]uint64, bsize)
	}

	for _, X := range uniqueXKeys {
		bad := BadX[X]
		bset := make([]uint64, bsize)
		for _, u := range bad {
			bset[u>>6] |= 1 << (u & 63)
		}
		for _, u := range bad {
			row := FailA[u]
			for k := 0; k < bsize; k++ {
				row[k] |= bset[k]
			}
		}
	}

	for _, Y := range uniqueYKeys {
		bad := BadY[Y]
		bset := make([]uint64, bsize)
		for _, v := range bad {
			bset[v>>6] |= 1 << (v & 63)
		}
		for _, v := range bad {
			row := FailB[v]
			for k := 0; k < bsize; k++ {
				row[k] |= bset[k]
			}
		}
	}

	WAB := make([][]int64, M)
	for i := 0; i < M; i++ {
		WAB[i] = make([]int64, M)
	}
	for p, cost := range uniquePairs {
		badA := BadX[p.X]
		badB := BadY[p.Y]
		for _, u := range badA {
			row := WAB[u]
			for _, v := range badB {
				row[v] += cost
			}
		}
	}

	cvs := make([]CostVal, 0, M*M)
	for i := 0; i < M; i++ {
		uVal := V[i]
		for j := 0; j < M; j++ {
			vVal := V[j]
			if (FailA[i][j>>6] & (1 << (j & 63))) != 0 {
				continue
			}
			if (FailB[i][j>>6] & (1 << (j & 63))) != 0 {
				continue
			}
			cost := CostA[i] + CostB[j] - WAB[i][j]
			cvs = append(cvs, CostVal{cost: cost, val: uVal + vVal})
		}
	}

	sort.Slice(cvs, func(i, j int) bool {
		if cvs[i].cost != cvs[j].cost {
			return cvs[i].cost < cvs[j].cost
		}
		return cvs[i].val > cvs[j].val
	})

	var filtered []CostVal
	maxVal := int64(-1)
	for _, cv := range cvs {
		if cv.val > maxVal {
			maxVal = cv.val
			filtered = append(filtered, CostVal{cost: cv.cost, val: maxVal})
		}
	}

	out := bufio.NewWriter(os.Stdout)
	for i := 0; i < q; i++ {
		d := dArr[i]
		ans := int64(0)
		l, r := 0, len(filtered)-1
		for l <= r {
			mid := (l + r) / 2
			if filtered[mid].cost <= d {
				ans = filtered[mid].val
				l = mid + 1
			} else {
				r = mid - 1
			}
		}
		if i > 0 {
			out.WriteByte(' ')
		}
		fmt.Fprint(out, ans)
	}
	out.WriteByte('\n')
	out.Flush()
}
```