#include <bits/stdc++.h>
using namespace std;
inline long long getint() {
  long long _x = 0, _tmp = 1;
  char _tc = getchar();
  while ((_tc < '0' || _tc > '9') && _tc != '-') _tc = getchar();
  if (_tc == '-') _tc = getchar(), _tmp = -1;
  while (_tc >= '0' && _tc <= '9') _x *= 10, _x += (_tc - '0'), _tc = getchar();
  return _x * _tmp;
}
inline long long add(long long _x, long long _y,
                     long long _mod = 1000000007ll) {
  long long _ = _x + _y;
  if (_ >= _mod) _ -= _mod;
  return _;
}
inline long long sub(long long _x, long long _y,
                     long long _mod = 1000000007ll) {
  long long _ = _x - _y;
  if (_ < 0) _ += _mod;
  return _;
}
inline long long mul(long long _x, long long _y,
                     long long _mod = 1000000007ll) {
  long long _ = _x * _y;
  if (_ >= _mod) _ %= _mod;
  return _;
}
long long mypow(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 1ll;
  long long _tmp = mypow(_a, _x / 2, _mod);
  _tmp = mul(_tmp, _tmp, _mod);
  if (_x & 1) _tmp = mul(_tmp, _a, _mod);
  return _tmp;
}
long long mymul(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 0ll;
  long long _tmp = mymul(_a, _x / 2, _mod);
  _tmp = add(_tmp, _tmp, _mod);
  if (_x & 1) _tmp = add(_tmp, _a, _mod);
  return _tmp;
}
inline bool equal(double _x, double _y) {
  return _x > _y - 1e-9 && _x < _y + 1e-9;
}
int __ = 1, _cs;
struct Seg {
  int vl, tag, lft, rgt;
  Seg() { vl = tag = lft = rgt = 0; }
} st[101010 << 5];
int _cnt = 1;
int copy(int id) {
  int now = _cnt++;
  st[now] = st[id];
  return now;
}
void push(int now, int l, int r) {
  if (st[now].tag) {
    st[now].lft = copy(st[now].lft);
    st[now].rgt = copy(st[now].rgt);
    st[st[now].lft].vl += st[now].tag;
    st[st[now].lft].tag += st[now].tag;
    st[st[now].rgt].vl += st[now].tag;
    st[st[now].rgt].tag += st[now].tag;
  }
  st[now].tag = 0;
}
void modify(int now, int l, int r, int ql, int qr) {
  if (r < ql || l > qr || ql > qr) return;
  if (ql <= l && r <= qr) {
    st[now].vl++;
    st[now].tag++;
    return;
  }
  push(now, l, r);
  st[now].lft = copy(st[now].lft);
  st[now].rgt = copy(st[now].rgt);
  modify(st[now].lft, l, ((l + r) >> 1), ql, qr);
  modify(st[now].rgt, ((l + r) >> 1) + 1, r, ql, qr);
}
int query(int now, int l, int r, int pos) {
  if (now == 0) {
    assert(false);
    return 0;
  }
  if (l == r) return st[now].vl;
  push(now, l, r);
  if (pos <= ((l + r) >> 1)) return query(st[now].lft, l, ((l + r) >> 1), pos);
  return query(st[now].rgt, ((l + r) >> 1) + 1, r, pos);
}
void build() {}
int n, x[101010], l, q, ans[101010];
vector<pair<int, int> > v[101010];
void init() {
  n = getint();
  for (int i = 1; i <= n; i++) x[i] = getint();
  l = getint();
  q = getint();
  for (int i = 0; i < q; i++) {
    int ai = getint();
    int bi = getint();
    if (ai > bi) swap(ai, bi);
    v[ai].push_back({bi, i});
  }
}
int root[101010];
void solve() {
  root[n] = copy(0);
  for (int i = n - 1; i >= 1; i--) {
    int bl = i + 1, br = n, til = i + 1;
    while (bl <= br) {
      int bmid = (bl + br) >> 1;
      if (x[bmid] - x[i] <= l)
        til = bmid, bl = bmid + 1;
      else
        br = bmid - 1;
    }
    root[i] = copy(root[til]);
    modify(root[i], 1, n, i + 1, n);
    for (pair<int, int> qry : v[i])
      ans[qry.second] = query(root[i], 1, n, qry.first);
  }
  for (int i = 0; i < q; i++) printf("%d\n", ans[i]);
}
int main() {
  build();
  while (__--) {
    init();
    solve();
  }
}
