#include <bits/stdc++.h>
using namespace std;
using lint = long long int;
using pint = pair<int, int>;
using plint = pair<lint, lint>;
struct fast_ios {
  fast_ios() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(20);
  };
} fast_ios_;
template <typename T>
istream &operator>>(istream &is, vector<T> &vec) {
  for (auto &v : vec) is >> v;
  return is;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (auto v : vec) os << v << ",";
  os << "]";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const deque<T> &vec) {
  os << "deq[";
  for (auto v : vec) os << v << ",";
  os << "]";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const set<T> &vec) {
  os << "{";
  for (auto v : vec) os << v << ",";
  os << "}";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const unordered_set<T> &vec) {
  os << "{";
  for (auto v : vec) os << v << ",";
  os << "}";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const multiset<T> &vec) {
  os << "{";
  for (auto v : vec) os << v << ",";
  os << "}";
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const unordered_multiset<T> &vec) {
  os << "{";
  for (auto v : vec) os << v << ",";
  os << "}";
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &pa) {
  os << "(" << pa.first << "," << pa.second << ")";
  return os;
}
template <typename TK, typename TV>
ostream &operator<<(ostream &os, const map<TK, TV> &mp) {
  os << "{";
  for (auto v : mp) os << v.first << "=>" << v.second << ",";
  os << "}";
  return os;
}
template <typename TK, typename TV>
ostream &operator<<(ostream &os, const unordered_map<TK, TV> &mp) {
  os << "{";
  for (auto v : mp) os << v.first << "=>" << v.second << ",";
  os << "}";
  return os;
}
template <typename T>
void ndarray(vector<T> &vec, int len) {
  vec.resize(len);
}
template <typename T, typename... Args>
void ndarray(vector<T> &vec, int len, Args... args) {
  vec.resize(len);
  for (auto &v : vec) ndarray(v, args...);
}
template <typename T>
bool mmax(T &m, const T q) {
  if (m < q) {
    m = q;
    return true;
  } else
    return false;
}
template <typename T>
bool mmin(T &m, const T q) {
  if (m > q) {
    m = q;
    return true;
  } else
    return false;
}
template <typename T1, typename T2>
pair<T1, T2> operator+(const pair<T1, T2> &l, const pair<T1, T2> &r) {
  return make_pair(l.first + r.first, l.second + r.second);
}
template <typename T1, typename T2>
pair<T1, T2> operator-(const pair<T1, T2> &l, const pair<T1, T2> &r) {
  return make_pair(l.first - r.first, l.second - r.second);
}
struct Doubling {
  int N, INVALID, lgD;
  vector<vector<int>> mat;
  Doubling() : N(0), lgD(0) {}
  Doubling(const vector<int> &vec_nxt, int INVALID = -1, int lgd = 0)
      : N(vec_nxt.size()), INVALID(INVALID), lgD(lgd) {
    while ((1 << lgD) < N) lgD++;
    mat.assign(lgD, vector<int>(N, INVALID));
    mat[0] = vec_nxt;
    for (int i = (0), i_end_ = (N); i < i_end_; i++)
      if (mat[0][i] < 0 or mat[0][i] >= N) mat[0][i] = INVALID;
    for (int d = (0), d_end_ = (lgD - 1); d < d_end_; d++)
      for (int i = (0), i_end_ = (N); i < i_end_; i++)
        if (mat[d][i] != INVALID) mat[d + 1][i] = mat[d][mat[d][i]];
  }
  int kth_next(int now, int k) {
    if (k >= (1 << lgD)) exit(8);
    for (int d = 0; k and now != INVALID; d++, k >>= 1)
      if (k & 1) now = mat[d][now];
    return now;
  }
  int distance(int l, int r) {
    if (l >= r) return 0;
    if (mat[lgD - 1][l] < r) return -1;
    int ret = 0;
    for (int d = (lgD)-1, d_begin_ = (0); d >= d_begin_; d--) {
      if (mat[d][l] < r and mat[d][l] != INVALID) ret += 1 << d, l = mat[d][l];
    }
    return ret + 1;
  }
};
int main() {
  int N;
  cin >> N;
  vector<lint> X(N);
  cin >> X;
  lint L;
  int Q;
  cin >> L >> Q;
  vector<int> right(N);
  for (int i = (0), i_end_ = (N); i < i_end_; i++) {
    int r = prev(upper_bound((X).begin(), (X).end(), X[i] + L)) - X.begin();
    right[i] = r;
  }
  Doubling d(right, N);
  for (int q = (0), q_end_ = (Q); q < q_end_; q++) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    if (a > b) swap(a, b);
    cout << d.distance(a, b) << endl;
  }
}
