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++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include <iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<math.h>
using namespace std;
typedef long long ll;
#define int long long
typedef vector<int> VI;
typedef pair<int, int> pii;
typedef priority_queue<int> PQ;
template<class T>bool chmax(T &a, const T &b) { if (a < b) { a = b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b < a) { a = b; return 1; } return 0; }
#define fore(i,a) for(auto &i:a)
#define REP(i,n) for(int i=0;i<n;i++)
#define eREP(i,n) for(int i=0;i<=n;i++)
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define eFOR(i,a,b) for(int i=(a);i<=(b);++i)
#define SORT(c) sort((c).begin(),(c).end())
#define rSORT(c) sort((c).rbegin(),(c).rend())
#define LB(x,a) lower_bound((x).begin(),(x).end(),(a))
#define UB(x,a) upper_bound((x).begin(),(x).end(),(a))
#define INF 1000000000
#define LLINF 9223372036854775807
#define mod 1000000007
//vector<vector<int> > dp;
//vector<vector<vector<int> > > vvvi;
//dp=vector<vector<int> >(N, vector<int>(M,0));
//vector<pair<int,int> > v;
//v.push_back(make_pair(x,y));
//priority_queue<int,vector<int>, greater<int> > q2;



signed main() {
	cin.tie(0);
	ios::sync_with_stdio(false);

	int N, L, q;
	cin >> N;
	VI X(N);
	REP(i, N)cin >> X[i];
	cin >> L >> q;


	int dp[30][100010];
	int day[30][100010];
	int sum[100010] = { 0 };
	//jから2のi乗個進んだ距離
	//jから2のi乗日で進める個数

	REP(i, N)sum[i + 1] = sum[i] + X[i];
	REP(i, 30)REP(j, 100010)dp[i][j] = day[i][j] = INF * 10;


	int k = 0, s = 0, g = 0;

	while (k < N - 1) {
		//cout << [g + 1] << " " << sum[s] << endl;
		while (g != N - 1 && X[g + 1] - X[s] <= L) g++;
		day[0][k] = g - s;
		//cout << day[0][k] << " " << k << " " << g << " " << s << endl;
		k++;
		s++;
	}





	REP(i, N - 1)dp[0][i] = X[i + 1] - X[i];
	
	FOR(i, 1, 30) {
		REP(j, N - 1) {
			/*if (j + (1LL << (i - 1)) > N - 2)break;
			if (dp[i - 1][j + (1LL << (i - 1))] != INF * 10 && j + (1LL << (i - 1)) <= N - 2)
				dp[i][j] = dp[i - 1][j] + dp[i - 1][j + (1LL << (i - 1))];

			*/
			
			if (j + day[i-1][j] >= N -1)continue;
			//cout << i << " " << j << " " << day[i - 1][j] << " " << day[i - 1][j + day[i - 1][j]] << endl;
			
			//cout << i << " " << j <<" "<< day[i][j] << endl;
			day[i][j] = day[i - 1][j] + day[i - 1][j + day[i - 1][j]];
			
		}
	}
	//cout << "K" << endl;
	REP(i, 30) {
		REP(j, N) {
			if (day[i][j] != INF * 10) {
				//cout << day[i][j] << " ";
				//cout << i << " " << j << " " << day[i][j] << endl;
			}
		}
		//cout << endl;
	}
	


	while (q--) {
		int a, b;
		cin >> a >> b;
		a--; b--;
		if (b < a)swap(a,b);
		int ans = 0;
		int now = a;
		
		do {

			//cout << q << " " << ans << " " << dist << endl;
		
			bool F = true;

			for (int i = 25; i >= 0; i--) {
				if (day[i][now] + now <= b) {
					F = false;
					
					now += (1LL << day[i][now]);
					ans += (1LL << i);
				}
			}

			if (F) {
				cout << ans << endl;
				break;
			}
			else continue;

		} while (1);

		/*
		do {

			//cout << q << " " << ans << " " << dist << endl;
			if (dist == 0)ans++;
			bool F = true;

			for (int i = 25; i >= 0; i--) {
				if (dp[i][now] + dist <= L) {
					F = false;
					dist += dp[i][now];
					now += (1LL << i);
				}
			}
			
			if (now >= b) {
				cout << ans << endl;
				break;
			}
			if (F)dist = 0;

		} while (1);

		*/
		
	}
	return 0;
}