Given a positive integer k, two arrays are called k-similar if:

  * they are strictly increasing; 
  * they have the same length; 
  * all their elements are positive integers between 1 and k (inclusive); 
  * they differ in exactly one position. 



You are given an integer k, a strictly increasing array a and q queries. For each query, you are given two integers l_i ≤ r_i. Your task is to find how many arrays b exist, such that b is k-similar to array [a_{l_i},a_{l_i+1}…,a_{r_i}]. 

Input

The first line contains three integers n, q and k (1≤ n, q ≤ 10^5, n≤ k ≤ 10^9) — the length of array a, the number of queries and number k.

The second line contains n integers a_1, a_2, …,a_n (1 ≤ a_i ≤ k). This array is strictly increasing — a_1 < a_2 < … < a_n.

Each of the following q lines contains two integers l_i, r_i (1 ≤ l_i ≤ r_i ≤ n).

Output

Print q lines. The i-th of them should contain the answer to the i-th query.

Examples

Input


4 2 5
1 2 4 5
2 3
3 4


Output


4
3


Input


6 5 10
2 4 6 7 8 9
1 4
1 2
3 5
1 6
5 5


Output


8
9
7
6
9

Note

In the first example:

In the first query there are 4 arrays that are 5-similar to [2,4]: [1,4],[3,4],[2,3],[2,5].

In the second query there are 3 arrays that are 5-similar to [4,5]: [1,5],[2,5],[3,5].
import java.util.*;
import java.io.*;
import java.lang.*;

public class Problem {
    static int Mod = 1000000007;

    public static void main(String[] args) {
        MyScanner scan = new MyScanner();
        PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
       // int t = scan.nextInt();
         int t=1;
        while (t-- > 0) {
        int n=scan.nextInt(), q=scan.nextInt(),k=scan.nextInt();
        int a[]=new int[n];
        for(int i=0;i<n;i++)
        a[i]=scan.nextInt();
  
        int[] diff= new int[n];
        diff[0]=a[0];
        diff[n-1]=a[n-1];
        for(int i=1;i<=n-2;i++){
            diff[i]=a[i+1]-a[i-1]-2;
        }
        long prefix[]=new long[n];
        prefix[0]=diff[0];
        for(int i=1;i<n;i++)
        prefix[i]=prefix[i-1]+diff[i];

        while(q-->0){
           long ans=0;
            int l=scan.nextInt()-1;
            int r=scan.nextInt()-1;
         
            if(l==r){
                out.println(k-1);
                continue;
            }
            else{
                ans= (a[l+1]-2) + (k-a[r-1]-1) + (prefix[r-1]-prefix[l]);
                out.println(ans);
            }
        }
            
        }
        out.close();
    }

    static class Pair {
        int l;
        int r;

        Pair(int l, int r) {
            this.l = l;
            this.r = r;
        }
    }

    public static void sort(int[] array) {
        ArrayList<Integer> copy = new ArrayList<>();
        for (Integer i : array)
            copy.add(i);
        Collections.sort(copy);
        for (int i = 0; i < array.length; i++)
            array[i] = copy.get(i);
    }

    public static void sort(long[] array) {
        ArrayList<Long> copy = new ArrayList<>();
        for (Long i : array)
            copy.add(i);
        Collections.sort(copy);
        for (int i = 0; i < array.length; i++)
            array[i] = copy.get(i);
    }

    public static long gcd(long a,long b)
    {
        if (b == 0)
            return a;
        return gcd(b, a % b); // gcd(a,b) = gcd(a-b,b) or gcd(a,b) = gcd(b,a%b) where a>b
    }

    public static long lcm(long a, long b) {
        return (a / gcd(a, b)) * b;
    }

    static long power(long x, long y) {
        long temp;
        if (y == 0) // a^b= (a^b/2)^2 if b is even
            return 1; // = (a*a^(b-1)) if b is odd
        temp = power(x, y / 2);
        if (y % 2 == 0)
            return temp * temp;
        else
            return x * temp * temp;
    }

    static long mod(long x) {
        return ((x % Mod + Mod) % Mod);
    }

    static long add(long a, long b) {
        return mod(mod(a) + mod(b));
    }

    static long mul(long a, long b) {
        return mod(mod(a) * mod(b));
    }

    static long pow(long x, long y, int p) {
        long res = 1; // Initialize result
        x = x % p; // Update x if it is more than or equal to p

        if (x == 0)
            return 0; // In case x is divisible by p;

        while (y > 0) {
            // If y is odd, multiply x with result
            if ((y & 1) != 0)
                res = (res * x) % p;

            // y must be even now
            y = y >> 1; // y = y/2
            x = (x * x) % p;
        }
        return res;
    }

}

class MyScanner {
    BufferedReader br;
    StringTokenizer st;

    public MyScanner() {
        br = new BufferedReader(new InputStreamReader(System.in));
    }

    String next() {
        while (st == null || !st.hasMoreElements()) {
            try {
                st = new StringTokenizer(br.readLine());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return st.nextToken();
    }

    int nextInt() {
        return Integer.parseInt(next());
    }

    long nextLong() {
        return Long.parseLong(next());
    }

    double nextDouble() {
        return Double.parseDouble(next());
    }

    String nextLine() {
        String str = "";
        try {
            str = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }

}
