using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Program
{
    static void Main(string[] args)
    {
            // 入力
            string[] sS = System.Console.ReadLine().Trim().Split(' ');
            int iN = int.Parse(sS[0]);
            sS = System.Console.ReadLine().Trim().Split(' ');
            List<int> lstHtl = new List<int>();
            for (int i = 0; i < iN; i++) { lstHtl.Add(int.Parse(sS[i])); }                // HotelX位置
            sS = System.Console.ReadLine().Trim().Split(' ');
            int iL = int.Parse(sS[0]);
            sS = System.Console.ReadLine().Trim().Split(' ');
            int iQ = int.Parse(sS[0]);
            List<ClsMov> lstMov = new List<ClsMov>();                                     // クエリ
            for (int i = 0; i < iQ; i++)
            {
                sS = System.Console.ReadLine().Trim().Split(' ');
                int iA = int.Parse(sS[0]) - 1;                                            // 0始まりに変換
                int iB = int.Parse(sS[1]) - 1;                                            // 0始まりに変換
                ClsMov oneUsr = new ClsMov();
                oneUsr.iD = i;
                if (iB > iA) { oneUsr.iA = iA; oneUsr.iB = iB; oneUsr.sS = iA.ToString() + "-" + iB.ToString(); }
                else { oneUsr.iA = iB; oneUsr.iB = iA; oneUsr.sS = iB.ToString() + "-" + iA.ToString(); }
                lstMov.Add(oneUsr);
            }
            //// Debug入力
            //int iN = 100000;
            //int iL = 100;
            //List<int> lstHtl = new List<int>();
            //lstHtl.Add(0);
            //for (int i = 0; i < iN - 1; i++) { lstHtl.Add(lstHtl[lstHtl.Count - 1] + (i % iL ) + 1); }  // HotelX位置
            //int iQ = 1000;
            //List<ClsMov> lstMov = new List<ClsMov>();                                                   // クエリ
            //for (int i = 0; i < iQ; i++)
            //{
            //    int iA = i;                                                                             // 0始まりに変換
            //    int iB = i + 50000;                                                                     // 0始まりに変換
            //    ClsMov oneUsr = new ClsMov();
            //    oneUsr.iD = i;
            //    if (iB > iA) { oneUsr.iA = iA; oneUsr.iB = iB; oneUsr.sS = iA.ToString() + "-" + iB.ToString(); }
            //    else { oneUsr.iA = iB; oneUsr.iB = iA; oneUsr.sS = iB.ToString() + "-" + iA.ToString(); }
            //    lstMov.Add(oneUsr);
            //}

            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();

            // 解析
            lstMov.Sort(delegate (ClsMov mca1, ClsMov mca2) { return (int)(mca1.iA - mca2.iA == 0 ? mca1.iB - mca2.iB : mca1.iA - mca2.iA); }); // Aの昇順のBの昇順
            List<ClsMov> lstClc = new List<ClsMov>();
            for (int i = 0; i < lstMov.Count; i++)
            {
                Boolean bEx = false; int iC = 0;                                                        // 一度計算したクエリ
                for (int j = 0; j < lstClc.Count; j++) { if (lstClc[j].sS == lstMov[i].sS) { bEx = true; iC = lstClc[j].iC; break; } }
                if (bEx) { lstMov[i].iC = iC; }                                                         // 一度計算したクエリ
                else                                                                                    // 初めての計算
                {
                    int iSt = lstHtl[lstMov[i].iA];                                                     // StartのX位置
                    int iEd = lstHtl[lstMov[i].iB];                                                     // End  のX位置
                    int iNx = lstMov[i].iA;                                                             // 移動可能範囲内の最遠Hotel
                    int iCt = 0;                                                                        // 移動回数
                    Boolean bEd = false;                                                                // 目的Hotel到達したフラグ
                    while (!bEd)
                    {
                        iCt += 1;
                        iSt = lstHtl[iNx];                                                              // 移動開始HotelX位置
                        for (int j = iNx + 1; j <= lstMov[i].iB; j++)
                        {
                            if (lstHtl[j] - iSt <= iL)                                                  // 移動可能範囲内のHotel
                            {
                                iNx = j;
                                if (j == lstMov[i].iB)                                                  // 目的Hotel
                                {
                                    bEd = true;
                                    lstMov[i].iC = iCt;
                                    ClsMov oneUsr = new ClsMov();
                                    oneUsr.iD = lstClc.Count;
                                    oneUsr.iA = lstMov[i].iA;
                                    oneUsr.iB = lstMov[i].iB;
                                    oneUsr.sS = lstMov[i].sS;
                                    lstClc.Add(oneUsr);                                                 // 一度計算したクエリとして登録
                                }
                            }
                            else { break; }                                                             // 移動可能範囲外で抜ける
                        }
                    }
                }
            }
            lstMov.Sort(delegate (ClsMov mca1, ClsMov mca2) { return (int)(mca1.iD - mca2.iD); });      // Dの昇順

            // 出力
            for (int i = 0; i < lstMov.Count; i++)
            {
                System.Console.WriteLine("{0}", lstMov[i].iC.ToString().Trim());
            }
            //// debug出力
            //for (int i = 0; i < lstMov.Count; i++)
            //{
            //    System.Console.WriteLine("{0}", lstMov[i].iC.ToString().Trim());
            //    if (i > 100) { break; }
            //}

            sw.Stop();
#if DEBUG
            Console.WriteLine();
            Console.WriteLine("{0}", sw.Elapsed.ToString());
            Console.WriteLine("続行するには何かキーを押してください．．．");
            Console.ReadKey();
#endif
    }

        // クエリ列情報
        private class ClsMov
        {
            public int iD { get; set; } = 0;            // Index
            public int iA { get; set; } = 0;            // Start
            public int iB { get; set; } = 0;            // End
            public int iC { get; set; } = 0;            // 移動日数
            public string sS { get; set; } = "";        // 識別
        }

}
