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# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
class Solve{
    int n;
    long l;
    int q;
    long[] x;
    int[] a;
    int[] b;
    public Solve(){}
    public static int Main(){
        new Solve().Calc();
        return 0;
    }
    void Calc(){
        getinput();
        int logx = 1;
        {   
            long i = 1;
            while(i <= x[n-1]){
                i*=2;
                logx++;
            }
        }
        int[,] dp = new int[n,logx];
        for(int i=0;i<n;i++){
            int f = 0;
            int ll = n-1;
            while(f != ll){
                int c = (f+ll+1)/2;
                if(x[c] - x[i] <= l){
                    f = c;
                }
                else{
                    ll = c-1;
                }
            }
            dp[i,0] = f;
        }
        for(int i=1;i<logx;i++){
            for(int j=0;j<n;j++){
                dp[j,i] = dp[dp[j,i-1],i-1];
            }
        }
        for(int i = 0;i<q;i++){
            int sum=1;
            int d = 0;
            int s,t;
            if(a[i]<b[i]){
                s = a[i];
                t = b[i];
            }
            else{
                s = b[i];
                t = a[i];
            }
            while(dp[s,d] < t){
                d++;
            }
            if(d == 0){
                Console.WriteLine(1);
                continue;
            }
            int r = dp[s,d-1];
            for(int ii=0;ii<d-1;ii++){
                sum*=2;
                if(dp[r,d-ii-2] < t){
                    sum++;
                    r = dp[r,d-ii-2];
                }
            }
            if(r<t){
                sum++;
            }
            Console.WriteLine(sum);
        }
    }
    void getinput(){
        n = int.Parse(Console.ReadLine());
        string[] str = Console.ReadLine().Split(' ');
        x = new long[n];
        for(int i=0;i<n;i++){
            x[i] = Int64.Parse(str[i]);
        }
        l = Int64.Parse(Console.ReadLine());
        q = int.Parse(Console.ReadLine());
        a = new int[q];
        b = new int[q];
        for(int i=0;i<q;i++){
            str = Console.ReadLine().Split(' ');
            a[i] = int.Parse(str[0])-1;
            b[i] = int.Parse(str[1])-1;
        }
    }    
}