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: Time Limit Exceeded)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            //入力開始
            int N = int.Parse(Console.ReadLine());
            string[] str1 = Console.ReadLine().Split(' ');
            int[] x = new int[N];
            for (int i = 0; i < N; i++)
            {
                x[i] = int.Parse(str1[i]);
            }
            int L = int.Parse(Console.ReadLine());
            int Q = int.Parse(Console.ReadLine());
            int[] a = new int[Q];
            int[] b = new int[Q];
            string[] str2 = new string[2];
            for (int i = 0; i < Q; i++)
            {
                str2 = Console.ReadLine().Split(' ');
                a[i] = int.Parse(str2[0]);
                b[i] = int.Parse(str2[1]);
            }
            //入力完了

            /*入力検査
            Console.WriteLine("\n");
            Console.WriteLine(N);
            for (int i = 0; i < N; i++)
            {
                Console.Write(x[i]);
                Console.Write(" ");
            }
            Console.Write("\n");
            Console.WriteLine(L);
            Console.WriteLine(Q);
            for (int i = 0; i < Q; i++)
            {
                Console.Write("{0} {1}\n", a[i], b[i]);
            }
            入力検査終了*/

            /*//旧タイプdays計算開始
            for (int j = 0; j < Q; j++)
            {
                int[] sampleArray = sample(x, a[j], b[j]);
                int daysValue = days(sampleArray, L);
                Console.WriteLine(daysValue);

                sample検査
                for (int i = 0; i < sampleArray.Length;i++)
                {
                    Console.Write("\n");
                    Console.Write("\n");
                }
                sample検査終了
          　 }
            //旧タイプdays計算終了*/

            //新タイプdays計算開始
            for (int j = 0; j < Q; j++)
            {
                int days = daysAlt(x, a[j], b[j], L);
                Console.WriteLine(days);
            }
            //新タイプdays計算終了
        }
        internal static int[] sample(int[] x, int a, int b )
        {
            a -= 1;
            b -= 1;
            int absolute = System.Math.Abs(b - a);
            int[] sample = new int[absolute + 1];
            for (int i = 0; i < absolute + 1; i++)
            {
                sample[i] = x[i + Math.Min(b,a)];
            }
            return sample;
        }
        internal static int days(int[] sample, int L)
        {
            int days = 0;
            int start = 0;
            int relay = 1;

            int flag = 0;
            while (flag == 0)
            {
                while ((relay < sample.Length) && (sample[relay] - sample[start] <= L))
                {
                    relay++;
                }
                if ((relay < sample.Length) && (sample[relay] - sample[start] > L))
                {
                    days++;
                    start = relay-1;
                }
                else
                {
                    days++;
                    flag = 1;
                }
            }
            return days;
        }
        internal static int daysAlt(int[] x, int a, int b, int L)
        {
            a -= 1;
            b -= 1;
            int A = Math.Min(b,a);
            int B = Math.Max(b, a);
            int days = 0;
            int start = A;
            int relay = A + 1;

            int flag = 0;
            while (flag == 0)
            {
                while ((relay < B + 1) && (x[relay] - x[start] <= L))
                {
                    relay++;
                }
                if ((relay < B + 1) && (x[relay] - x[start] > L))
                {
                    days++;
                    start = relay - 1;
                }
                else
                {
                    days++;
                    flag = 1;
                }
            }
            return days;
        }
    }
}