#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
const long long inf = 1e16;
int n, m, P;
long long sum[N], a[N];
vector<long long> func[N << 2];
template <typename T>
inline void chkmax(T &x, T y) {
  x = max(x, y);
}
template <typename T>
inline void chkmin(T &x, T y) {
  x = min(x, y);
}
template <typename T>
inline void read(T &x) {
  T f = 1;
  x = 0;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-') f = -f;
  for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';
  x *= f;
}
inline vector<long long> merge(int l, int r, int mid, vector<long long> &f,
                               vector<long long> &g) {
  long long suml = sum[mid] - sum[l - 1], sumr = sum[r] - sum[mid];
  vector<long long> ret(f.size() + g.size() - 1, inf);
  for (int i = 0, j = 0; i < f.size(); ++i) {
    long long xl = f[i], xr = (i + 1 == f.size() ? inf : f[i + 1] - 1),
              yl = xl + suml - (long long)i * P,
              yr = xr + suml - (long long)i * P;
    while (j > 0 && g[j] > yl) --j;
    while (j < g.size() && (j == 0 || g[j] <= yl)) ++j;
    --j;
    for (; j < g.size() && g[j] <= yr; ++j)
      ret[i + j] = min(ret[i + j], max(xl, g[j] - suml + (long long)i * P));
  }
  ret[0] = -inf;
  return ret;
}
inline void build(int now, int l, int r) {
  if (l == r) {
    func[now].emplace_back(-inf);
    func[now].emplace_back(P - a[l]);
    return;
  }
  int mid = l + r >> 1;
  build(now << 1, l, mid);
  build(now << 1 | 1, mid + 1, r);
  func[now] = merge(l, r, mid, func[now << 1], func[now << 1 | 1]);
}
inline long long query(int now, int l, int r, int ql, int qr, long long cur) {
  if (l == ql && r == qr)
    return cur + sum[r] - sum[l - 1] -
           (long long)P *
               (upper_bound(func[now].begin(), func[now].end(), cur) -
                func[now].begin() - 1);
  int mid = l + r >> 1;
  if (mid >= qr)
    return query(now << 1, l, mid, ql, qr, cur);
  else if (mid + 1 <= ql)
    return query(now << 1 | 1, mid + 1, r, ql, qr, cur);
  else
    return query(now << 1 | 1, mid + 1, r, mid + 1, qr,
                 query(now << 1, l, mid, ql, mid, cur));
}
int main() {
  read(n);
  read(m);
  read(P);
  for (int i = 1; i <= n; ++i) {
    read(a[i]);
    sum[i] = sum[i - 1] + a[i];
  }
  build(1, 1, n);
  for (int l, r; m--;) {
    read(l), read(r);
    printf("%lld\n", query(1, 1, n, l, r, 0));
  }
  return 0;
}
