using System;

public class AtCoder
{
    public static void Main()
    {
        string[] s;
        s = NextS();
        int n = int.Parse(s[0]);
        s = NextS();
        int[] x = new int[n];
        for (int i = 0; i < n; i++) x[i] = int.Parse(s[i]);
        s = NextS();
        int d = int.Parse(s[0]);
        s = NextS();
        int q = int.Parse(s[0]);
        int[] a = new int[q];
        int[] b = new int[q];
        int tmp0, tmp1;
        for(int i=0; i<q; i++)
        {
            s = NextS();
            tmp0 = int.Parse(s[0]) - 1;
            tmp1 = int.Parse(s[1]) - 1;
            if (tmp0 < tmp1)
            {
                a[i] = tmp0;
                b[i] = tmp1;
            }
            else
            {
                a[i] = tmp1;
                b[i] = tmp0;
            }
        }

        int c = 0;
        int[] group = new int[n];
        bool[] hub = new bool[n];
        group[0] = 0;
        hub[0] = true;
        int tmp = x[0] + d;
        for(int i=1; i<n; i++)
        {
            if (x[i] < tmp)
            {
                group[i] = c;
            }
            else
            {
                c++;
                if(!hub[i - 1])
                {
                    group[i - 1] = c;
                    hub[i - 1] = true;
                }
                group[i] = c;
                tmp = x[i - 1] + d;
            }
        }

        UnionFind uf = new UnionFind(n);
        int l = 0; int r = 0; int m = 0;      
        for (int i = 1; i < n; i++)
        {
            if (hub[i]) continue;
            tmp = x[i] + d;
            l = i;
            r = n;
            while (r - l > 1)
            {
                m = (l + r) / 2;
                if (x[m] > tmp) r = m;
                else l = m;
            }
            uf.par[i] = l;
        }

        for (int i = 0; i < q; i++)
        {
            if (group[a[i]] == group[b[i]])
            {
                Console.WriteLine(1);
                continue;
            }
            if (hub[b[i]])
            {                
                Console.WriteLine(group[b[i]] - group[a[i]]);
            }
            else
            {
                if (hub[a[i]])
                {
                    Console.WriteLine(group[b[i]] - group[a[i]] + 1);
                }
                else
                {
                    if(b[i] < uf.Find(a[i])) Console.WriteLine(group[b[i]] - group[a[i]]);
                    else Console.WriteLine(group[b[i]] - group[a[i]] + 1);
                }
            }            
        }
    }

    public static void DebugWL(object x) { System.Diagnostics.Debug.WriteLine(x); }
    public static string[] NextS() { return Console.ReadLine().Trim().Split(' '); }
}

// UnionFind(int n)
// n: the number of nodes
// int Find(int node): return the parent
// void Union(int node, int node)

public class UnionFind
{
    public int[] par;
    int n;
    public UnionFind(int t)
    {
        n = t;
        par = new int[n];
        for (int i = 0; i < n; i++)
        {
            par[i] = i;
        }
    }

    public int Find(int x)
    {
        if (par[x] == x) return x;
        else
        {
            par[x] = Find(par[x]);
            return par[x];
        }
    }

    public void Union(int x, int y)
    {
        x = Find(x);
        y = Find(y);
        if (x == y) return;
        else par[x] = y;
    }
}