#include <bits/stdc++.h>
using namespace std;
int N, Q;
long long K;
vector<int> A;
struct SegTree {
#define L(x) ((x) + (x))
#define R(x) (L(x) + 1)
vector<vector<int>> rem;
vector<vector<long long>> ans;
void build(int ll, int rr, int id) {
if (ll == rr) {
for (int k = 0; k < K; k++) {
rem[id][k] = max(0, k + A[ll]);
ans[id][k] = rem[id][k] / K;
rem[id][k] %= K;
}
} else {
int mm = ll + (rr - ll) / 2;
build(ll, mm, L(id));
build(mm + 1, rr, R(id));
for (int k = 0; k < K; k++) {
rem[id][k] = rem[R(id)][rem[L(id)][k]];
ans[id][k] = ans[L(id)][k] + ans[R(id)][rem[L(id)][k]];
}
}
}
long long query(int ql, int qr, int ll, int rr, int id, vector<int> &retrem, vector<long long> &retans) {
if (ql <= ll && rr <= qr) {
retrem = rem[id];
retans = ans[id];
return retans[0];
} else {
int mm = ll + (rr - ll) / 2;
if (ql <= mm && qr > mm) {
vector<int> lrem, rrem;
vector<long long> lans, rans;
query(ql, qr, ll, mm, L(id), lrem, lans);
query(ql, qr, mm + 1, rr, R(id), rrem, rans);
retrem.resize(K), retans.resize(K);
for (int k = 0; k < K; k++) {
retrem[k] = rrem[lrem[k]];
retans[k] = lans[k] + rans[lrem[k]];
}
return retans[0];
} else if (ql <= mm) {
return query(ql, qr, ll, mm, L(id), retrem, retans);
} else {
return query(ql, qr, mm + 1, rr, R(id), retrem, retans);
}
}
}
SegTree (void) {
rem = vector<vector<int>>(N * 4, vector<int>(K));
ans = vector<vector<long long>>(N * 4, vector<long long>(K));
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N >> Q >> K;
A.resize(N);
for (int i = 1; i <= N; i++) {
cin >> A[i];
if (~i & 1) {
A[i] = -A[i];
}
}
SegTree seg;
seg.build(1, N, 1);
while (Q--) {
int L, R;
cin >> L >> R;
vector<int> retrem;
vector<long long> retans;
cout << seg.query(L, R, 1, N, 1, retrem, retans) << '\n';
}
}