#include <bits/stdc++.h>
namespace IO {
inline char get_char() {
  static const int Rlen = 1 << 22 | 1;
  static char buf[Rlen], *p1, *p2;
  return (p1 == p2) && (p2 = (p1 = buf) + fread(buf, 1, Rlen, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
template <typename T>
inline T get() {
  char c;
  T num;
  bool f = false;
  while (!isdigit(c = get_char())) f = c == '-';
  num = c ^ 48;
  while (isdigit(c = get_char())) num = (num + (num << 2) << 1) + (c ^ 48);
  return f ? -num : num;
}
inline int gi() { return get<int>(); }
}  // namespace IO
using namespace IO;
using std::cerr;
using std::cout;
const int N = 1e6 + 7;
const long long INF = 1e16;
int n, m, p, a[N];
long long sum[N << 1];
std::vector<long long> f[N << 1];
int lc[N << 1], rc[N << 1], tot;
void build(int u, int l, int r) {
  if (l == r) {
    f[u].push_back(-INF), f[u].push_back(p - a[l]);
    sum[u] = a[l];
    return;
  }
  int mid = l + r >> 1;
  build(lc[u] = ++tot, l, mid);
  build(rc[u] = ++tot, mid + 1, r);
  f[u].resize(r - l + 2, INF);
  f[u][0] = -INF;
  l = lc[u], r = rc[u];
  sum[u] = sum[l] + sum[r];
  for (int register i = 0, j = 0, ls = f[l].size(), rs = f[r].size(); i < ls;
       ++i) {
    long long xl = f[l][i], xr = (i + 1 == ls) ? INF : f[l][i + 1] - 1;
    long long yl = xl + sum[l] - (long long)i * p,
              yr = xr + sum[l] - (long long)i * p;
    while (j > 0 && f[r][j] > yl) --j;
    while (j < rs && f[r][j] <= yl) ++j;
    if (j) --j;
    while (j < rs && f[r][j] <= yr)
      f[u][i + j] = std::min(f[u][i + j],
                             std::max(xl, f[r][j] - sum[l] + (long long)i * p)),
               ++j;
  }
}
long long c;
void query(int u, int l, int r, int ql, int qr) {
  if (ql <= l && r <= qr) {
    c += sum[u] -
         (long long)p *
             (std::upper_bound(f[u].begin(), f[u].end(), c) - f[u].begin() - 1);
    return;
  }
  int mid = l + r >> 1;
  if (ql <= mid) query(lc[u], l, mid, ql, qr);
  if (mid < qr) query(rc[u], mid + 1, r, ql, qr);
}
signed main() {
  n = gi(), m = gi(), p = gi();
  for (int register i = 1; i <= n; ++i) a[i] = gi();
  build(tot = 1, 1, n);
  while (m--) {
    int l = gi(), r = gi();
    c = 0;
    query(1, 1, n, l, r);
    cout << c << "\n";
  }
  return 0;
}
