Priests of the Quetzalcoatl cult want to build a tower to represent a power of their god. Tower is usually made of power-charged rocks. It is built with the help of rare magic by levitating the current top of tower and adding rocks at its bottom. If top, which is built from k - 1 rocks, possesses power p and we want to add the rock charged with power wk then value of power of a new tower will be {wk}p. 

Rocks are added from the last to the first. That is for sequence w1, ..., wm value of power will be

<image>

After tower is built, its power may be extremely large. But still priests want to get some information about it, namely they want to know a number called cumulative power which is the true value of power taken modulo m. Priests have n rocks numbered from 1 to n. They ask you to calculate which value of cumulative power will the tower possess if they will build it from rocks numbered l, l + 1, ..., r. 

Input

First line of input contains two integers n (1 ≤ n ≤ 105) and m (1 ≤ m ≤ 109).

Second line of input contains n integers wk (1 ≤ wk ≤ 109) which is the power of rocks that priests have.

Third line of input contains single integer q (1 ≤ q ≤ 105) which is amount of queries from priests to you.

kth of next q lines contains two integers lk and rk (1 ≤ lk ≤ rk ≤ n). 

Output

Output q integers. k-th of them must be the amount of cumulative power the tower will have if is built from rocks lk, lk + 1, ..., rk.

Example

Input

6 1000000000
1 2 2 3 3 3
8
1 1
1 6
2 2
2 3
2 4
4 4
4 5
4 6


Output

1
1
2
4
256
3
27
597484987

Note

327 = 7625597484987
#include <bits/stdc++.h>
using namespace std;
char getc() {
  char c = getchar();
  while ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') && (c < '0' || c > '9'))
    c = getchar();
  return c;
}
int gcd(int n, int m) { return m == 0 ? n : gcd(m, n % m); }
int read() {
  int x = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9')
    x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
  return x * f;
}
int n, m, p[70], a[100010], pre[100010], pos[100010], cnt, q;
int ksm(int a, int k, int P) {
  int s = 1;
  for (; k; k >>= 1, a = 1ll * a * a % P)
    if (k & 1) s = 1ll * s * a % P;
  return s;
}
long long KSM(int a, long long k) {
  long long s = 1;
  if (k > 32) return 2000000000;
  for (int i = 1; i <= k; i++) {
    s *= a;
    if (s >= 2000000000) break;
  }
  return s;
}
long long get(int l, int r) {
  long long s = 1;
  for (int i = pre[r]; i >= l; i = pre[i - 1]) {
    s = KSM(a[i], s);
    if (s >= 2000000000) break;
  }
  return s;
}
signed main() {
  n = read(), p[0] = read();
  m = 0;
  while (p[m] > 1) {
    m++;
    int x = p[m] = p[m - 1];
    for (int i = 2; i * i <= x; i++)
      if (x % i == 0) {
        p[m] /= i;
        p[m] *= i - 1;
        while (x % i == 0) x /= i;
      }
    if (x > 1) p[m] /= x, p[m] *= x - 1;
  }
  for (int i = 1; i <= n; i++) a[i] = read();
  for (int i = 1; i <= n; i++)
    if (a[i] == 1)
      pos[++cnt] = i, pre[i] = pre[i - 1];
    else
      pre[i] = i;
  pos[++cnt] = n + 1;
  q = read();
  while (q--) {
    int l = read(), r = read(), ans = 1;
    int u = *lower_bound(pos + 1, pos + cnt + 1, l);
    long long t = get(min(min(r, l + m), u - 1) + 1, r);
    if (u <= min(r, l + m)) t = 1;
    for (int i = min(min(r, l + m), u - 1); i >= l; i--) {
      ans = ksm(a[i], ans, p[i - l]);
      t = KSM(a[i], t);
      if (i > l && t >= p[i - l]) ans += p[i - l];
    }
    printf("%d\n", ans % p[0]);
  }
  return 0;
}
