#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
using namespace std;
ll D;
int N,Q;
vector<ll> a;
struct Elem{
ll mn,preflcost,idx;
};
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N >> D;
a.resize(N+1);
a[0]=0;
for(int i=1;i<=N;i++){
cin >> a[i];
}
cin >> Q;
vector<int> ans(Q);
vector<vector<pair<int,int>>> querys(N+1);//L,idx_ans
for(int i=0;i<Q;i++){
int l,r;
cin >> l >> r;
querys[r].push_back(make_pair(l,i));
}
vector<ll> c(N+1,0);
c[N]=a[N];
for(int i=N-1;i>=1;i--){
if(a[i]<=a[i+1]){
c[i]=c[i+1]-(a[i+1]-a[i])/D;
}
else{
c[i]=c[i+1]+(a[i]-a[i+1]+D-1)/D;
}
}
vector<ll> pref(N+1,0);
for(int i=1;i<=N;i++){
pref[i]=pref[i-1]+c[i];
}
vector<Elem> st{{0,0,0}};
for(int i=1;i<=N;i++){
while(st.size()>0&&st.back().mn>c[i]){
st.pop_back();
}
ll prefantcost=st.back().preflcost;
int len = i-st.back().idx;
ll prefrcost= prefantcost + 1LL*len*c[i];
st.push_back({c[i],prefrcost,i});
for(auto [L,idx_ans] : querys[i]){
Elem elemleft={-1,-1,-1};
int lo=0,hi=st.size()-1;
while(lo<=hi){
int mid = lo+(hi-lo)/2;
if(st[mid].idx>=L){
elemleft=st[mid];
hi=mid-1;
}
else{
lo=mid+1;
}
}
assert(elemleft.idx!=-1);//trouvé !
if(a[L]-(c[L]-elemleft.mn)*D<0){
ans[idx_ans]=-1;
continue;
}
ans[idx_ans]=(pref[i]-pref[L-1])
-(1LL*(elemleft.idx-L+1)*elemleft.mn + prefrcost - elemleft.preflcost);
}
}
for(int i=0;i<Q;i++){
cout << ans[i] << endl;
}
}