#include <bits/stdc++.h>
using namespace std;
const int maxn = 100 * 1000 + 10, maxm = (1 << 17), mod = (int)1e9 + 7,
          hash = 701, inf = (1 << 29);
const double pi = 3.14159265359, ee = 2.71828;
struct node {
  int a, r, id, ans, pos;
} mem[maxn];
struct group {
  int x, y, mx, id, ans;
} q[maxn];
int d[maxn], seg[2 * maxm], x, y, val;
vector<int> age, tmp;
bool by_r(node x, node y) { return x.r < y.r; }
bool by_id1(node x, node y) { return x.id < y.id; }
bool by_id2(group x, group y) { return x.id < y.id; }
bool by_mx(group x, group y) { return x.mx > y.mx; }
void add(int id) {
  for (; id < maxn; id += (id & -id)) d[id]++;
}
int sum(int id) {
  int ans = 0;
  for (; id; id -= (id & -id)) ans += d[id];
  return ans;
}
void update(int v, int l, int r) {
  if (y < l || x > r) return;
  if (x <= l && y >= r)
    seg[v] = max(seg[v], val);
  else {
    update(2 * v, l, (l + r) / 2), update(2 * v + 1, (l + r) / 2 + 1, r);
    seg[v] = max(seg[2 * v], seg[2 * v + 1]);
  }
}
void query(int v, int l, int r) {
  if (y < l || x > r) return;
  if (x <= l && y >= r)
    val = max(val, seg[v]);
  else
    query(2 * v, l, (l + r) / 2), query(2 * v + 1, (l + r) / 2 + 1, r);
}
int main() {
  ios::sync_with_stdio(0);
  int n, qq, k, po = 0;
  cin >> n >> k;
  for (int i = 0; i < n; i++) cin >> mem[i].r, mem[i].id = i;
  for (int i = 0; i < n; i++) cin >> mem[i].a, age.push_back(mem[i].a);
  sort(age.begin(), age.end());
  for (int i = 0; i < n; i++)
    mem[i].pos = upper_bound(age.begin(), age.end(), mem[i].a) - age.begin();
  sort(mem, mem + n, by_r);
  for (int i = 0; i < n; i++) {
    while (po < n && mem[po].r <= mem[i].r) add(mem[po++].pos);
    x = lower_bound(age.begin(), age.end(), mem[i].a - k) - age.begin(),
    y = upper_bound(age.begin(), age.end(), mem[i].a + k) - age.begin();
    mem[i].ans = sum(y) - sum(x);
  }
  cin >> qq, sort(mem, mem + n, by_id1), po = n - 1;
  for (int i = 0; i < qq; i++) {
    cin >> q[i].x >> q[i].y, q[i].x--, q[i].y--,
        q[i].id = i, q[i].mx = max(mem[q[i].x].r, mem[q[i].y].r);
    if (mem[q[i].x].a < mem[q[i].y].a) swap(q[i].x, q[i].y);
  }
  for (int i = 0; i < n; i++) tmp.push_back(mem[i].a);
  sort(q, q + qq, by_mx), sort(mem, mem + n, by_r);
  for (int i = 0; i < qq; i++) {
    while (po >= 0 && mem[po].r >= q[i].mx)
      x = y = mem[po].pos, val = mem[po--].ans, update(1, 0, n);
    x = tmp[q[i].x] - k, y = tmp[q[i].y] + k;
    x = lower_bound(age.begin(), age.end(), x) - age.begin() + 1,
    y = upper_bound(age.begin(), age.end(), y) - age.begin();
    val = 0, query(1, 0, n), q[i].ans = val;
  }
  sort(q, q + qq, by_id2);
  for (int i = 0; i < qq; i++) cout << (q[i].ans == 0 ? -1 : q[i].ans) << endl;
  return 0;
}
