先找到每个点一步最远跳到哪个点,然后用个倍增即可
#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define sc second
#define pb push_back
#define ll long long
#define trav(v,x) for(auto v:x)
#define all(x) (x).begin(), (x).end()
#define VI vector<int>
#define VLL vector<ll>
#define pll pair<ll, ll>
#define double long double
//#define int long long
using namespace std;
const int N = 1e6 + 100;
const int inf = 1e9;
//const ll inf = 1e18;
const ll mod = 998244353;//1e9 + 7;
#ifdef LOCAL
void debug_out(){cerr << endl;}
template<typename Head, typename... Tail>
void debug_out(Head H, Tail... T)
{
cerr << " " << to_string(H);
debug_out(T...);
}
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
void sol()
{
ll n, m;
cin >> n;
VLL a(n);
for(int i = 0; i < n; i++)
cin >> a[i];
cin >> m;
vector<VLL> jp(n, VLL(20, 0));
for(int i = n - 1; i >= 0; i--)
{
if(i == n - 1)
{
for(int j = 0; j < 20; j++)
jp[i][j] = n;
continue;
}
int x = upper_bound(all(a), a[i] + m) - a.begin();
--x;
jp[i][0] = x;
for(int j = 1; j < 20; j++)
jp[i][j] = (jp[i][j - 1] == n ? n : jp[jp[i][j - 1]][j - 1]);
}
int qq;
cin >> qq;
while(qq--)
{
int x, y;
cin >> x >> y;
--x, --y;
if(x > y)
swap(x, y);
int ans = 0;
for(int i = 19; i >= 0; i--)
{
if(jp[x][i] <= y)
x = jp[x][i], ans += 1 << i;
}
if(x < y)
++ans;
cout << ans << '\n';
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
// int tt;
// cin >> tt;
// while(tt--)
sol();
}