#include <bits/stdc++.h>
using namespace std;
const int K = 10;
int k;
struct node {
pair<int64_t, int> state[K];
node() {
state[0] = {-1, -1};
}
node(int64_t x) {
for (int sum = 0; sum < K; ++sum) {
int64_t nsum = max(sum + x, int64_t(0));
state[sum] = {nsum / k, nsum % k};
}
}
node operator+(const node &r) {
if (this->state[0].first == -1) return r;
if (r.state[0].first == -1) return *this;
node ans;
for (int sum = 0; sum < K; ++sum) {
int64_t get = state[sum].first;
int64_t nsum = state[sum].second;
get += r.state[nsum].first;
ans.state[sum] = {get, r.state[nsum].second};
}
return ans;
}
};
class segment_tree {
int n;
vector<node> seg;
public:
segment_tree(int n) : n(n), seg(2 * n) {}
void set(int i, int64_t x) {
seg[i += n] = node(x);
for (i >>= 1; i > 0; i >>= 1) {
seg[i] = seg[2 * i] + seg[2 * i + 1];
}
}
node query(int l, int r) {
node ansL, ansR;
for (l += n, r += n + 1; l < r; l >>= 1, r >>= 1) {
if (l & 1) ansL = ansL + seg[l++];
if (r & 1) ansR = seg[--r] + ansR;
}
return ansL + ansR;
}
};
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n, q;
cin >> n >> q >> k;
vector<int64_t> a(n);
segment_tree st(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
if (i & 1) {
a[i] = -a[i];
}
st.set(i, a[i]);
}
while (q--) {
int l, r;
cin >> l >> r;
--l, --r;
node ans = st.query(l, r);
cout << ans.state[0].first << '\n';
}
}