Problem:
Score : 700 points

Problem Statement

N hotels are located on a straight line. The coordinate of the i-th hotel (1 \leq i \leq N) is x_i.

Tak the traveler has the following two personal principles:

He never travels a distance of more than L in a single day.

He never sleeps in the open. That is, he must stay at a hotel at the end of a day.

You are given Q queries. The j-th (1 \leq j \leq Q) query is described by two distinct integers a_j and b_j.
For each query, find the minimum number of days that Tak needs to travel from the a_j-th hotel to the b_j-th hotel following his principles.
It is guaranteed that he can always travel from the a_j-th hotel to the b_j-th hotel, in any given input.

Constraints

2 \leq N \leq 10^5

1 \leq L \leq 10^9

1 \leq Q \leq 10^5

1 \leq x_i < x_2 < ... < x_N \leq 10^9

x_{i+1} - x_i \leq L

1 \leq a_j,b_j \leq N

a_j \neq b_j

N,\,L,\,Q,\,x_i,\,a_j,\,b_j are integers.

Partial Score

200 points will be awarded for passing the test set satisfying N \leq 10^3 and Q \leq 10^3.

Input

The input is given from Standard Input in the following format:

N
x_1 x_2 ... x_N
L
Q
a_1 b_1
a_2 b_2
:
a_Q b_Q

Output

Print Q lines.
The j-th line (1 \leq j \leq Q) should contain the minimum number of days that Tak needs to travel from the a_j-th hotel to the b_j-th hotel.

Sample Input 1

9
1 3 6 13 15 18 19 29 31
10
4
1 8
7 3
6 7
8 5

Sample Output 1

4
2
1
2

For the 1-st query, he can travel from the 1-st hotel to the 8-th hotel in 4 days, as follows:

Day 1: Travel from the 1-st hotel to the 2-nd hotel. The distance traveled is 2.

Day 2: Travel from the 2-nd hotel to the 4-th hotel. The distance traveled is 10.

Day 3: Travel from the 4-th hotel to the 7-th hotel. The distance traveled is 6.

Day 4: Travel from the 7-th hotel to the 8-th hotel. The distance traveled is 10.

Solution in C++ (Clang 10.0.0) (judge verdict: Runtime Error)

/// Source : https://atcoder.jp/contests/arc060/tasks/arc060_c
/// Author : liuyubobobo
/// Time   : 2020-09-24

#include <iostream>
#include <cstdio>
#include <vector>
#include <cassert>

using namespace std;


/// Binary Lifting
/// Time Complexity: init: O(nlogn + nlog|max_dis|)
///                  query: O(log|max_dis| * logn)
/// Space Complexity: O(nlog|max_dis|)
class Hotels{

private:
    vector<vector<int>> dp;

public:
    Hotels(int N, int L, const vector<int>& hotels) : dp(N){

        for(int i = 0; i < N; i ++){
            dp[i].push_back(i);

            int k = binary_search(hotels, hotels[i] + L);
            if(k == N) k --;
            dp[i].push_back(k);
        }
//        cout << "k == 0 completed" << endl;

        for(int k = 1; dp[0].back() != N - 1; k ++){
            for(int i = 0; i < N; i ++)
                dp[i].push_back(dp[dp[i][k]][k]);
        }
//        cout << "init completed" << endl;
    }

    int query(int a, int b){

        a --, b --;
        if(a > b) swap(a, b);

        int cur = a, res = 0;
        while(true){
            int k = binary_search(dp[cur], b);
            if(k == 0) return res + 1;

            res += (1 << (k - 1));
            cur = dp[cur][k];
            if(cur == b) return res;
        }
        assert(false);
        return -1;
    }

private:
    int binary_search(const vector<int>& v, int target){

        int l = 0, r = v.size();
        while(l < r){
            int mid = (l + r + 1) / 2;
            if(v[mid] > target) r = mid - 1;
            else l = mid;
        }
        return l;
    }
};

int main() {

//    vector<int> hotels1 = {1, 3, 6, 13, 15, 18, 19, 29, 31};
//    Hotels h1(9, 10, hotels1);
//    cout << h1.query(1, 8) << endl; // 4
//    cout << h1.query(7, 3) << endl; // 2
//    cout << h1.query(6, 7) << endl; // 1
//    cout << h1.query(8, 5) << endl; // 2

    int N;
    scanf("%d", &N);

    vector<int> hotels(N);
    for(int i = 0; i < N; i ++) scanf("%d", &hotels[i]);

    int L;
    scanf("%d", &L);

    Hotels h(N, L, hotels);

    int Q, a, b;
    scanf("%d", &Q);
    while(Q --){
        scanf("%d%d", &a, &b);
        printf("%d\n", h.query(a, b));
    }

    return 0;
}