#include <bits/stdc++.h>
using namespace std;
using ull = unsigned long long;
typedef unsigned long long ul; typedef __uint128_t L;
struct ModFast {
ul b,m; ModFast(ul b_) : b(b_), m(ul((L(1)<<64)/b)) {}
ul reduce(ul a) {
ul q = (ul)((L(m)*a)>>64), r = a-q*b;
return r>=b?r-b:r; }
};
ModFast MF(int(1e9) + 7);
template <int MOD_> struct modnum {
static constexpr int MOD = MOD_;
static_assert(MOD_ > 0, "MOD must be positive");
private:
using ll = long long;
int v;
static int minv(int a, int m) {
a %= m;
assert(a);
return a == 1 ? 1 : int(m - ll(minv(m, a)) * ll(m) / a);
}
public:
modnum() : v(0) {}
modnum(ll v_) : v(int(v_ % MOD)) { if (v < 0) v += MOD; }
explicit operator int() const { return v; }
friend std::ostream& operator << (std::ostream& out, const modnum& n) { return out << int(n); }
friend std::istream& operator >> (std::istream& in, modnum& n) { ll v_; in >> v_; n = modnum(v_); return in; }
friend bool operator == (const modnum& a, const modnum& b) { return a.v == b.v; }
friend bool operator != (const modnum& a, const modnum& b) { return a.v != b.v; }
modnum inv() const {
modnum res;
res.v = minv(v, MOD);
return res;
}
friend modnum inv(const modnum& m) { return m.inv(); }
modnum neg() const {
modnum res;
res.v = v ? MOD-v : 0;
return res;
}
friend modnum neg(const modnum& m) { return m.neg(); }
modnum operator- () const {
return neg();
}
modnum operator+ () const {
return modnum(*this);
}
modnum& operator ++ () {
v ++;
if (v == MOD) v = 0;
return *this;
}
modnum& operator -- () {
if (v == 0) v = MOD;
v --;
return *this;
}
modnum& operator += (const modnum& o) {
v += o.v;
if (v >= MOD) v -= MOD;
return *this;
}
modnum& operator -= (const modnum& o) {
v -= o.v;
if (v < 0) v += MOD;
return *this;
}
modnum& operator *= (const modnum& o) {
v = MF.reduce(ull(v) * o.v);
return *this;
}
modnum& operator /= (const modnum& o) {
return *this *= o.inv();
}
friend modnum operator ++ (modnum& a, int) { modnum r = a; ++a; return r; }
friend modnum operator -- (modnum& a, int) { modnum r = a; --a; return r; }
friend modnum operator + (const modnum& a, const modnum& b) { return modnum(a) += b; }
friend modnum operator - (const modnum& a, const modnum& b) { return modnum(a) -= b; }
friend modnum operator * (const modnum& a, const modnum& b) { return modnum(a) *= b; }
friend modnum operator / (const modnum& a, const modnum& b) { return modnum(a) /= b; }
};
template <typename T> T pow(T a, long long b) {
assert(b >= 0);
T r = 1; while (b) { if (b & 1) r *= a; b >>= 1; a *= a; } return r;
}
using num = modnum<int(1e9) + 7>;
const int MAXN = 5.1e4;
int N, K;
num pref[MAXN][20];
num ipref[MAXN][20];
int Q;
int main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> N >> K;
num cur[20][20];
num icur[20][20];
for (int i = 0; i < K; i++) {
for (int j = 0; j < K; j++) {
cur[i][j] = icur[i][j] = (i == j);
}
}
const num INV2 = num(2).inv();
for (int z = 0; z <= N; z++) {
for (int i = 0; i < K; i++) {
for (int j = i; j < K; j++) {
pref[z][i] += cur[i][j];
}
}
for (int i = 0; i < K; i++) {
ipref[z][i] = icur[0][i];
}
if (z == N) break;
int v; cin >> v; v--;
for (int i = 0; i <= v; i++) {
for (int j = v; j >= i; j--) {
cur[i][v] += cur[i][j];
}
}
for (int i = 0; i < v; i++) {
for (int j = v; j < K; j++) {
icur[i][j] -= INV2 * icur[v][j];
}
}
for (int i = v; i < K; i++) {
icur[v][i] *= INV2;
}
}
cin >> Q;
while (Q--) {
int l, r; cin >> l >> r; l--;
num res = 0;
for (int i = 0; i < K; i++) {
res += ipref[l][i] * pref[r][i];
}
cout << res << '\n';
}
return 0;
}