#include <bits/stdc++.h>
int cl, ce;
int l[100005], e[100005];
int64_t n, m, v;
int64_t ceil_div(int64_t a, int64_t b) {
  int64_t ans = a / b;
  if (a % b) ++ans;
  return ans;
}
int main(int argc, char* argv[]) {
  scanf("%lld%lld", &n, &m);
  scanf("%d%d", &cl, &ce);
  scanf("%lld", &v);
  for (int i = 0; i < cl; ++i) scanf("%d", &l[i]);
  for (int i = 0; i < ce; ++i) scanf("%d", &e[i]);
  int q;
  scanf("%d", &q);
  while (q--) {
    int64_t x1, y1, x2, y2;
    scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);
    if (x1 > x2) std::swap(x1, x2);
    if (y1 > y2) std::swap(y1, y2);
    if (x1 == x2) {
      printf("%lld\n", y2 - y1);
      continue;
    }
    int64_t ans = std::numeric_limits<int64_t>::max();
    int p = std::lower_bound(l, l + cl, y1) - l;
    if (p > 0) {
      int y = l[p - 1];
      ans = std::min(ans, (y1 - y) + (x2 - x1) + (y2 - y));
    }
    p = std::lower_bound(e, e + ce, y1) - e;
    if (p > 0) {
      int y = e[p - 1];
      ans = std::min(ans, (y1 - y) + ceil_div(x2 - x1, v) + (y2 - y));
    }
    p = std::lower_bound(l, l + cl, y1) - l;
    if (p < cl && l[p] <= y2) ans = std::min(ans, (y2 - y1) + (x2 - x1));
    p = std::lower_bound(e, e + ce, y1) - e;
    if (p < ce && e[p] <= y2)
      ans = std::min(ans, (y2 - y1) + ceil_div(x2 - x1, v));
    p = std::upper_bound(l, l + cl, y2) - l;
    if (p < cl) {
      int y = l[p];
      ans = std::min(ans, (y - y1) + (x2 - x1) + (y - y2));
    }
    p = std::upper_bound(e, e + ce, y2) - e;
    if (p < ce) {
      int y = e[p];
      ans = std::min(ans, (y - y1) + ceil_div(x2 - x1, v) + (y - y2));
    }
    printf("%lld\n", ans);
  }
  return 0;
}
