#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
#define endl '\n'
#pragma GCC optimize("Ofast")
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair < int, int >;
using pll = pair < ll, ll >;
const ll INF = 2e18;
const ll DIM = 500007;
const ld PI = 3.1415926535;
const int mod = 998244353;
class segTree {
public:
void build(ll sz) {
T.push_back({});
this->sz = sz;
}
void update(ll pos, ll val) {
update(0, -sz, sz, pos, val);
}
ll query(ll L, ll R) {
return query(0, -sz, sz, L, R);
}
private:
struct node {
int l, r;
ll mi;
node() {
l = -1;
r = -1;
mi = INF;
}
};
void push(int val) {
if(T[val].l == -1) {
T[val].l = T.size();
T.push_back({});
}
if(T[val].r == -1) {
T[val].r = T.size();
T.push_back({});
}
}
node combine(int v1, int v2) {
node res;
res.l = v1;
res.r = v2;
res.mi = min(T[v1].mi, T[v2].mi);
return res;
}
void update(int val, ll tl, ll tr, ll pos, ll x) {
if(tl == tr) {
T[val].mi = min(T[val].mi, x);
return;
}
push(val);
int tm = (tl + tr) >> 1;
if(pos <= tm) update(T[val].l, tl, tm, pos, x);
else update(T[val].r, tm + 1, tr, pos, x);
T[val] = combine(T[val].l, T[val].r);
}
ll query(int val, ll tl, ll tr, ll L, ll R) {
if(L <= tl && tr <= R) return T[val].mi;
if(tr < L || tl > R) return INF;
push(val);
int tm = (tl + tr) >> 1;
return min(query(T[val].l, tl, tm, L, R), query(T[val].r, tm + 1, tr, L, R));
}
ll sz;
vector < node > T;
};
struct jump {
int toP, toX;
ll val;
};
vector < vector < vector < jump > > > j;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
#ifdef IloveCP
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
ll n, q, k;
cin >> n >> q >> k;
vector < ll > a(n + 1);
for(int i = 1; i <= n; i++) cin >> a[i];
vector < ll > p(n + 1, 0);
for(int i = 1; i <= n; i++) {
if(i % 2 == 1) p[i] = a[i];
else p[i] = -a[i];
p[i] += p[i - 1];
}
j.resize(n + 1);
int firstZero = n + 1;
segTree t;
t.build(INF);
for(int i = n; i >= 1; i--) {
if(i % 2 == 1) {
j[i].resize(a[i] + 1, vector < jump >(19));
for(int x = 0; x <= a[i]; x++) {
ll tmp = x;
j[i][x][0].val = tmp / k;
tmp %= k;
ll pos = min(t.query(-INF, p[i] - tmp - 1), t.query(k + p[i] - tmp, INF));
if(pos == INF) {
j[i][x][0].toP = n + 1;
j[i][x][0].toX = 0;
}
else if(pos % 2 == 1) {
j[i][x][0].toP = n + 1;
j[i][x][0].toX = p[pos] - p[i] + tmp - k;
j[i][x][0].val++;
}
else if(pos % 2 == 0) {
if(pos == n) {
j[i][x][0].toP = n + 1;
j[i][x][0].toX = 0;
}
else {
j[i][x][0].toP = pos + 1;
j[i][x][0].toX = a[pos + 1];
}
}
/*
cout << i << " " << x << " ";
cout << j[i][x][0].toX << " ";
cout << j[i][x][0].toP << " ";
cout << j[i][x][0].val << endl;
*/
for(int p = 1; p < 19; p++) {
if(j[i][x][p - 1].toP <= n) {
j[i][x][p].val = j[i][x][p - 1].val + j[j[i][x][p - 1].toP][j[i][x][p - 1].toX][p - 1].val;
j[i][x][p].toP = j[j[i][x][p - 1].toP][j[i][x][p - 1].toX][p - 1].toP;
j[i][x][p].toX = j[j[i][x][p - 1].toP][j[i][x][p - 1].toX][p - 1].toX;
}
else j[i][x][p] = j[i][x][p - 1];
}
}
}
t.update(p[i], i);
}
for(int i = 0; i < q; i++) {
ll l, r;
cin >> l >> r;
if(l % 2 == 0) l++;
if(r % 2 == 0) r--;
if(l > r) {
cout << 0 << endl;
continue;
}
ll curr = l;
ll res = 0;
ll x = a[l];
for(int p = 18; p >= 0; p--) {
if(j[curr][x][p].toP <= r) {
res += j[curr][x][p].val;
ll tox = j[curr][x][p].toX;
ll top = j[curr][x][p].toP;
x = tox; curr = top;
}
}
res += x / k;
cout << res << endl;
}
return 0;
}