```go
package main
import (
"bytes"
"io"
"os"
"sort"
"strconv"
)
type FastScanner struct {
data []byte
idx int
}
func NewFastScanner() *FastScanner {
data, _ := io.ReadAll(os.Stdin)
return &FastScanner{data: data}
}
func (fs *FastScanner) NextInt() int64 {
n := len(fs.data)
for fs.idx < n && fs.data[fs.idx] <= ' ' {
fs.idx++
}
sign := int64(1)
if fs.data[fs.idx] == '-' {
sign = -1
fs.idx++
}
var val int64
for fs.idx < n {
c := fs.data[fs.idx]
if c < '0' || c > '9' {
break
}
val = val*10 + int64(c-'0')
fs.idx++
}
return val * sign
}
type Fenwick struct {
n int
bit []int
}
func NewFenwick(n int) *Fenwick {
return &Fenwick{n: n, bit: make([]int, n+1)}
}
func (f *Fenwick) Add(i, delta int) {
for i <= f.n {
f.bit[i] += delta
i += i & -i
}
}
func (f *Fenwick) Sum(i int) int {
res := 0
for i > 0 {
res += f.bit[i]
i -= i & -i
}
return res
}
type SegTree struct {
n int
tree []int
}
func NewSegTree(m int) *SegTree {
n := 1
for n < m {
n <<= 1
}
return &SegTree{n: n, tree: make([]int, 2*n)}
}
func (s *SegTree) Update(pos, val int) {
i := pos + s.n
if s.tree[i] >= val {
return
}
s.tree[i] = val
for i >>= 1; i > 0; i >>= 1 {
v := s.tree[i<<1]
if s.tree[i<<1|1] > v {
v = s.tree[i<<1|1]
}
if s.tree[i] == v {
break
}
s.tree[i] = v
}
}
func (s *SegTree) Query(l, r int) int {
if l > r {
return 0
}
l += s.n
r += s.n
res := 0
for l <= r {
if l&1 == 1 {
if s.tree[l] > res {
res = s.tree[l]
}
l++
}
if r&1 == 0 {
if s.tree[r] > res {
res = s.tree[r]
}
r--
}
l >>= 1
r >>= 1
}
return res
}
type Query struct {
t int64
l int64
r int64
id int
}
func lowerBound(a []int64, x int64) int {
return sort.Search(len(a), func(i int) bool { return a[i] >= x })
}
func upperBound(a []int64, x int64) int {
return sort.Search(len(a), func(i int) bool { return a[i] > x })
}
func max64(a, b int64) int64 {
if a > b {
return a
}
return b
}
func min64(a, b int64) int64 {
if a < b {
return a
}
return b
}
func main() {
fs := NewFastScanner()
n := int(fs.NextInt())
k := fs.NextInt()
r := make([]int64, n)
for i := 0; i < n; i++ {
r[i] = fs.NextInt()
}
a := make([]int64, n)
ages := make([]int64, n)
for i := 0; i < n; i++ {
a[i] = fs.NextInt()
ages[i] = a[i]
}
sort.Slice(ages, func(i, j int) bool { return ages[i] < ages[j] })
uniq := make([]int64, 0, n)
for _, v := range ages {
if len(uniq) == 0 || uniq[len(uniq)-1] != v {
uniq = append(uniq, v)
}
}
m := len(uniq)
agePos := make([]int, n)
for i := 0; i < n; i++ {
agePos[i] = lowerBound(uniq, a[i])
}
orderAsc := make([]int, n)
for i := 0; i < n; i++ {
orderAsc[i] = i
}
sort.Slice(orderAsc, func(i, j int) bool {
return r[orderAsc[i]] < r[orderAsc[j]]
})
g := make([]int, n)
fenwick := NewFenwick(m)
for l := 0; l < n; {
rr := l + 1
cur := r[orderAsc[l]]
for rr < n && r[orderAsc[rr]] == cur {
rr++
}
for i := l; i < rr; i++ {
idx := orderAsc[i]
fenwick.Add(agePos[idx]+1, 1)
}
for i := l; i < rr; i++ {
idx := orderAsc[i]
left := lowerBound(uniq, a[idx]-k) + 1
right := upperBound(uniq, a[idx]+k)
g[idx] = fenwick.Sum(right) - fenwick.Sum(left-1)
}
l = rr
}
q := int(fs.NextInt())
ans := make([]int, q)
queries := make([]Query, 0, q)
for i := 0; i < q; i++ {
x := int(fs.NextInt()) - 1
y := int(fs.NextInt()) - 1
left := max64(a[x], a[y]) - k
right := min64(a[x], a[y]) + k
if left > right {
ans[i] = -1
continue
}
t := max64(r[x], r[y])
queries = append(queries, Query{t: t, l: left, r: right, id: i})
}
sort.Slice(queries, func(i, j int) bool {
return queries[i].t > queries[j].t
})
orderDesc := make([]int, n)
for i := 0; i < n; i++ {
orderDesc[i] = i
}
sort.Slice(orderDesc, func(i, j int) bool {
return r[orderDesc[i]] > r[orderDesc[j]]
})
seg := NewSegTree(m)
ptr := 0
for _, qu := range queries {
for ptr < n && r[orderDesc[ptr]] >= qu.t {
idx := orderDesc[ptr]
seg.Update(agePos[idx], g[idx])
ptr++
}
l := lowerBound(uniq, qu.l)
rr := upperBound(uniq, qu.r) - 1
if l > rr {
ans[qu.id] = -1
continue
}
res := seg.Query(l, rr)
if res == 0 {
ans[qu.id] = -1
} else {
ans[qu.id] = res
}
}
var out bytes.Buffer
for i := 0; i < q; i++ {
out.WriteString(strconv.Itoa(ans[i]))
out.WriteByte('\n')
}
_, _ = os.Stdout.Write(out.Bytes())
}
```