#include <bits/stdc++.h>
using namespace std;
struct event {
long long sum;
long long val;
int idx;
};
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
int n;
long long d;
cin>>n>>d;
vector<long long> v(n);
for(auto &x : v) cin>>x;
vector<long long> div(n), a(n);
long long carry = 0;
for(int i = n-1; i >= 0; i--) {
div[i] = v[i] / d;
if(i < n-1 && v[i] % d > v[i + 1] % d) ++carry;
a[i] = div[i] + carry;
}
vector<long long> pref = a;
for(int i = 1; i < n; i++) {
pref[i] += pref[i-1];
}
int q;
cin>>q;
vector<long long> ans(q);
vector<vector<pair<int, int>>> query(n);
for(int i = 0; i < q; i++) {
int l, r;
cin>>l>>r;
--l, --r;
query[r].emplace_back(l, i);
}
vector<event> pq;
pq.push_back(event{0, -1, -1});
for(int i = 0; i < n; i++) {
while(!pq.empty() && pq.back().val >= a[i]) {
auto [s, x, idx] = pq.back();
pq.pop_back();
}
pq.push_back(event{pq.back().sum + a[i] * (i - pq.back().idx), a[i], i});
for(auto [l, idx] : query[i]) {
int j = lower_bound(pq.begin(), pq.end(), event{0, 0, l}, [](const event &e1, const event &e2) { return e1.idx < e2.idx; }) - pq.begin();
ans[idx] = (pref[i] - (l > 0 ? pref[l-1] : 0LL)) - (pq.back().sum - pq[j].sum + (pq[j].idx - l + 1) * pq[j].val);
if(a[l] - pq[j].val > div[l]) ans[idx] = -1;
}
}
for(auto &x : ans) cout << x << '\n';
return 0;
}