#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000005;
int n, m;
long long P, a[maxn], s[maxn];
vector<long long> b[4 * maxn];
struct node {
  int l, r;
} t[4 * maxn];
void buildt(int x, int l, int r) {
  t[x].l = l, t[x].r = r;
  if (l == r) {
    b[x].push_back(-(1ll << 60)), b[x].push_back(P - a[l]);
    return;
  }
  int mid = (l + r) >> 1;
  buildt(2 * x, l, mid);
  buildt(2 * x + 1, mid + 1, r);
  long long sl = s[mid] - s[l - 1];
  int j = 0;
  for (int i = 1; i <= b[2 * x].size() + b[2 * x + 1].size(); i++)
    b[x].push_back(1ll << 60);
  for (int i = 0; i < b[2 * x].size(); i++) {
    long long xl = b[2 * x][i],
              xr = (i + 1 == b[2 * x].size() ? (1ll << 60)
                                             : b[2 * x][i + 1] - 1),
              yl = xl + sl - i * P, yr = xr + sl - i * P;
    while (j && b[2 * x + 1][j] > yl) j--;
    while (j < b[2 * x + 1].size() && (j == 0 || b[2 * x + 1][j] <= yl)) j++;
    j--;
    while (j < b[2 * x + 1].size() && b[2 * x + 1][j] <= yr)
      b[x][i + j] = min(b[x][i + j], max(xl, b[2 * x + 1][j] + i * P - sl)),
               j++;
  }
  b[x][0] = -(1ll << 60);
}
long long get(int x, int L, int R, long long y) {
  int l = 0, r = b[x].size() - 1;
  if (y >= b[x][b[x].size() - 1])
    return y + s[R] - s[L - 1] - (b[x].size() - 1) * P;
  long long ret;
  while (l <= r) {
    int mid = (l + r) >> 1;
    if (y < b[x][mid])
      r = mid - 1, ret = s[R] - s[L - 1] - (mid - 1) * P;
    else
      l = mid + 1;
  }
  return y + ret;
}
long long query(int x, int l, int r, long long num) {
  if (t[x].l == l && t[x].r == r) {
    return get(x, l, r, num);
  }
  int mid = (t[x].l + t[x].r) >> 1;
  if (r <= mid)
    return query(2 * x, l, r, num);
  else if (l > mid)
    return query(2 * x + 1, l, r, num);
  else
    return query(2 * x + 1, mid + 1, r, query(2 * x, l, mid, num));
}
int main() {
  scanf("%d%d%lld", &n, &m, &P);
  for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
  for (int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i];
  buildt(1, 1, n);
  for (int i = 1; i <= m; i++) {
    int l, r;
    scanf("%d%d", &l, &r);
    printf("%lld\n", query(1, l, r, 0));
  }
  return 0;
}
