#include <bits/stdc++.h>
using namespace std;
const int maxN = 100 * 1000 + 5;
struct Node {
  int s, e, maxx;
};
struct Segment {
  Node node[4 * maxN];
  void build(int s, int e, int v = 1) {
    node[v].s = s;
    node[v].e = e;
    node[v].maxx = -1;
    if (e - s <= 1) return;
    int mid = (e + s) / 2;
    build(s, mid, v * 2);
    build(mid, e, v * 2 + 1);
  }
  void change(int s, int e, int x, int v = 1) {
    if (e <= node[v].s || node[v].e <= s) return;
    if (s <= node[v].s && node[v].e <= e) {
      node[v].maxx = max(x, node[v].maxx);
      return;
    }
    int l = v * 2, r = v * 2 + 1;
    change(s, e, x, l);
    change(s, e, x, r);
    node[v].maxx = max(node[l].maxx, node[r].maxx);
  }
  int get(int s, int e, int v = 1) {
    if (e <= s || e <= node[v].s || node[v].e <= s) return -1;
    if (s <= node[v].s && node[v].e <= e) return node[v].maxx;
    int l = v * 2, r = v * 2 + 1;
    return max(get(s, e, l), get(s, e, r));
  }
};
struct BIT {
  vector<int> val;
  void init(int sz) { val.resize(sz); }
  void add(int ind, int x) {
    ind++;
    for (int i = ind; i < ((int)(val).size()); i += i & (-i)) val[i] += x;
  }
  int get(int ind) {
    ind++;
    int res = 0;
    for (int i = ind; i > 0; i -= i & (-i)) res += val[i];
    return res;
  }
  int getsum(int l, int r) {
    if (r < l) return 0;
    return get(r) - get(l - 1);
  }
};
pair<int, int> p[maxN], que[maxN];
pair<int, int> r[maxN];
vector<int> a;
vector<int> lst[maxN];
BIT baz;
int n, k;
int cnt[maxN], ans[maxN], pnt[maxN];
int low(int x) { return lower_bound(a.begin(), a.end(), x) - a.begin(); }
int up(int x) { return upper_bound(a.begin(), a.end(), x) - a.begin(); }
Segment rmq;
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n >> k;
  baz.init(n + 1);
  rmq.build(0, n + 1);
  a.resize(n);
  for (int i = 0; i < n; i++)
    cin >> r[i].first, r[i].second = i, p[i].second = r[i].first;
  for (int i = 0; i < n; i++) cin >> a[i], p[i].first = a[i];
  sort(a.begin(), a.end());
  a.resize(unique(a.begin(), a.end()) - a.begin());
  sort(r, r + n);
  for (int i = 0; i < n; i++) pnt[r[i].second] = i;
  for (int i = 0; i < n;) {
    int ind = i;
    while (ind < n && (ind == i || r[ind].first == r[ind - 1].first)) {
      int x = p[r[ind].second].first;
      baz.add(low(x), 1);
      ind++;
    }
    ind = i;
    while (ind < n && (ind == i || r[ind].first == r[ind - 1].first)) {
      int x = p[r[ind].second].first;
      cnt[ind] = baz.getsum(low(x - k), up(x + k) - 1);
      ind++;
    }
    i = ind;
  }
  int Q;
  cin >> Q;
  for (int q = 0; q < Q; q++) {
    int x, y;
    cin >> x >> y;
    x--;
    y--;
    if (p[x].second > p[y].second) swap(x, y);
    que[q] = make_pair(x, y);
    lst[pnt[y]].push_back(q);
  }
  for (int i = n - 1; i >= 0;) {
    int ind = i;
    while (ind >= 0 && (ind == i || r[ind].first == r[ind + 1].first)) {
      int x = low(p[r[ind].second].first);
      rmq.change(x, x + 1, cnt[ind]);
      ind--;
    }
    ind = i;
    while (ind >= 0 && (ind == i || r[ind].first == r[ind + 1].first)) {
      for (int j = 0; j < ((int)(lst[ind]).size()); j++) {
        int u = lst[ind][j];
        int x = p[que[u].first].first, y = p[que[u].second].first;
        if (x > y) swap(x, y);
        int L = low(y - k), R = up(x + k);
        ans[u] = rmq.get(L, R);
      }
      ind--;
    }
    i = ind;
  }
  for (int i = 0; i < Q; i++) cout << ans[i] << endl;
  return 0;
}
