#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

#define REP(i,n) for(ll i=0;i<n;++i)
#define SORT(name) sort(name.begin(), name.end())
#define ZERO(p) memset(p, 0, sizeof(p))
#define MINUS(p) memset(p, -1, sizeof(p))
#if 1
#  define DBG(fmt, ...) printf(fmt, __VA_ARGS__)
#else
#  define DBG(fmt, ...)
#endif

#define MOD 1000000007
#define INF 1000000000
#define MAX_N 100010
#define MAX_Q 100010
#define MAX_K 20

// 重要要素：ダブリング

ll N, L, Q;
vector<ll> X;
vector< pair<ll, ll> > AB;  // クエリ

ll r[MAX_K][MAX_N];     // j 番目のホテルから 2^i 日以内に行ける最右のホテル

#if 0
// j 番目のホテルから 1 日で行ける最大を二分探索
ll search(ll j) {
    // 解の存在範囲を初期化
    ll lb = j, ub = N-1;
    // 解の存在範囲が1より大きい間、繰り返す
    while(ub - lb > 1) {
        ll mid = (lb + ub) / 2;
        if(X[mid] > X[j] + L) {
            ub = mid;
        } else {
            lb = mid;
        }
    }
    if(X[ub] > X[j] + L) { return lb; }
    return ub;
}

// a 番目のホテルから b 番目のホテルまでにかかる最小日数を二分探索
ll search2(ll a, ll b) {
    // 解の存在範囲を初期化
    ll lb = 0, ub = MAX_N;
    // 解の存在範囲が1より大きい間、繰り返す
    while(ub - lb > 1) {
        ll mid = (lb + ub) / 2;
        ll k = a;   // mid 日で行ける最右ホテル
        // mid のビットが立っているところを足す
        for(int i = MAX_K-1; i >= 0; --i) {
            if( ((mid >> i) & 1) == 1 ) {
                k = r[i][k];
            }
        }
        if(b <= k) {
            // mid 日数でたどり着けた
            ub = mid;
        } else {
            lb = mid;
        }
    }
    return ub;
}
#endif

// [lb, ub) の範囲で val 以下の要素で最大のもののインデックスを返す
// なければ -1 を返す
ll bin_search4(ll lb, ll ub, ll val) {
    lb--; ub--;
    while(ub - lb > 1) {
        ll mid = (lb + ub) / 2;
        if(X[mid] >= val) {
            ub = mid;
        } else {
            lb = mid;
        }
    }
    // この時点で lb + 1 = ub
    if(X[ub] <= val) { return ub; }
    if(lb < 0) { assert(false); return -1; }
    if(X[lb] > val) { assert(false); return -1; }
    return lb;
}

// ノード a からノード b へ行くときの最小遷移数
// たどり着けない場合は -1
ll doubling(ll a, ll b) {
    if(a == b) { return 0; }
    bool isReach = false;
    // 解の存在範囲を初期化
    ll lb = 0, ub = MAX_N;
    // 解の存在範囲が1より大きい間、繰り返す
    while(ub - lb > 1) {
        ll mid = (lb + ub) / 2;
        ll k = a;   // mid 日で行ける最右頂点
        // mid のビットが立っているところを足す
        for(int i = MAX_K-1; i >= 0; --i) {
            if( ((mid >> i) & 1) == 1 ) {
                k = r[i][k];
            }
        }
        if(b <= k) {
            // mid 日数でたどり着けた
            isReach = true;
            ub = mid;
        } else {
            lb = mid;
        }
    }
    assert(isReach);
    return (isReach) ? ub : -1;
}

int main()
{
    ZERO(r);
    // 入力の取得
    cin >> N;
    REP(i, N) {
        ll x;
        cin >> x;
        X.push_back(x);
    }
    cin >> L >> Q;
    REP(i, Q) {
        ll a, b;
        cin >> a >> b;
        AB.push_back(make_pair(a-1, b-1));
    }

    // r の作成
    REP(i, MAX_K) {
        REP(j, N) {
            if(i == 0) {
                r[i][j] = bin_search4(j, N, X[j] + L);
            } else {
                r[i][j] = r[i-1][r[i-1][j]];
            }
        }
    }

    //REP(i, 3) {
    //    REP(j, N) {
    //        DBG("r[%lld][%lld]=%lld\n", i, j, r[i][j]);
    //    }
    //}

    // クエリの処理
    for(auto& q : AB) {
        printf("%lld\n", doubling(min(q.first, q.second), max(q.first, q.second)));
    }
    return 0;
}


Measured memory_bytes: 18928