#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int res = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -f;
    ch = getchar();
  }
  while (isdigit(ch)) {
    res = (res << 1) + (res << 3) + (ch ^ 48);
    ch = getchar();
  }
  return res * f;
}
const int N = 2e6 + 5;
const long long INF = 1e17;
int n, a[N], mod;
namespace segtree {
int ls[N], rs[N], cnt = 1;
long long sum[N];
vector<long long> f[N];
void build(int k, int l, int r) {
  if (l == r) {
    f[k].push_back(-INF);
    f[k].push_back(mod - a[l]);
    sum[k] = a[l];
    return;
  }
  int mid = l + r >> 1;
  ls[k] = ++cnt;
  build(ls[k], l, mid);
  rs[k] = ++cnt;
  build(rs[k], mid + 1, r);
  int lc = ls[k], rc = rs[k], sizl = f[lc].size(), sizr = f[rc].size();
  f[k].resize(sizl + sizr - 1, INF);
  for (int i = 0, j = 0; i < sizl; i++) {
    long long xl = f[lc][i], xr = (i + 1 != sizl) ? f[lc][i + 1] : INF,
              yl = xl + sum[lc] - 1ll * mod * i,
              yr = xr + sum[lc] - 1ll * mod * i;
    while (j > 0 && f[rc][j] > yl) --j;
    while (j < sizr && f[rc][j] <= yl) ++j;
    if (j) j--;
    while (j < sizr && f[rc][j] <= yr)
      f[k][i + j] =
          min(f[k][i + j], max(xl, f[rc][j] - sum[lc] + 1ll * mod * i)),
               ++j;
  }
  f[k][0] = -INF;
  sum[k] = sum[lc] + sum[rc];
}
int que[205];
void search(int k, int l, int r, int ql, int qr) {
  if (ql <= l && r <= qr) {
    que[++que[0]] = k;
    return;
  }
  int mid = l + r >> 1;
  if (ql <= mid) search(ls[k], l, mid, ql, qr);
  if (qr > mid) search(rs[k], mid + 1, r, ql, qr);
}
inline long long query(int ql, int qr) {
  que[0] = 0;
  search(1, 1, n, ql, qr);
  long long res = 0;
  for (int i = 1; i <= que[0]; i++)
    res += sum[que[i]] -
           1ll * mod *
               (upper_bound(f[que[i]].begin(), f[que[i]].end(), res) -
                f[que[i]].begin() - 1);
  return res;
}
}  // namespace segtree
using namespace segtree;
int main() {
  n = read();
  int q = read();
  mod = read();
  for (int i = 1; i <= n; i++) a[i] = read();
  build(1, 1, n);
  while (q--) {
    int l = read(), r = read();
    cout << query(l, r) << "\n";
  }
  return 0;
}
