#include <bits/stdc++.h>
#define rep(a,b,c) for(auto a = (b); a != (c); a++)
#define repD(a,b,c) for(auto a = (b); a != (c); a--)
#define repIn(a, b) for(auto& a : (b))
#define repIn2(a, b, c) for(auto& [a, b] : (c))
constexpr bool dbg = 0;
#define DEBUG if constexpr(dbg)
#define DC DEBUG std::cerr
#define eol std::endl
#define int long long
#define ld long double
#define pb push_back
#define rg ranges
using namespace std;
constexpr int inf = 1e18;
int n, D, q;
vector<int> a, b, c, ap, ans, minAp, pref;
vector<array<int, 3>> queries;
int32_t main() {
ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin >> n >> D;
a.resize(n);
b.resize(n);
c.resize(n);
ap.resize(n);
pref.resize(n);
repIn(i, c) cin >> i;
cin >> q;
queries.resize(q);
ans.resize(q);
minAp.resize(q);
rep(i, 0, q) cin >> queries[i][0] >> queries[i][1], queries[i][2] = i;
rep(i, 0, n) a[i] = c[i] / D, b[i] = c[i] % D;
rg::sort(queries);
for(auto& [l, r, qi] : queries) l--, r--;
for(auto [l, r, qi] : queries) {
rep(i, l, r + 1) {
ap[i] = a[i];
rep(j, l + 1, i + 1) ap[i] -= (b[j] < b[j - 1]);
ans[qi] += ap[i];
DC << ap[i] << ' ';
}
DC << eol;
}
rep(i, 0, n) {
ap[i] = a[i];
rep(j, 1, i + 1) ap[i] -= (b[j] < b[j - 1]);
}
for(auto [l, r, qi] : queries) {
int minSuf = inf;
repD(i, r, l - 1) {
minSuf = min(minSuf, ap[i]);
ans[qi] -= minSuf;
}
minAp[qi] = minSuf;
//if(minSuf < 0) ans[qi] = -1;
}
int sum = 0;
rep(i, 1, n) sum += b[i] < b[i - 1], pref[i] = sum;
for(auto [l, r, qi] : queries) {
sum = pref[l];
ans[qi] -= sum * (r - l + 1);
if(minAp[qi] + sum < 0) ans[qi] = -1;
}
repIn(i, ans) cout << i << '\n';
}