#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  register long long x = 0, f = 1;
  register char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') x = x * 10 + (ch ^ 48), ch = getchar();
  return x * f;
}
const long long inf = 1e18;
const int N = 1e6 + 5;
vector<long long> c[N << 2];
int n, m;
long long a[N << 2], p;
void build(int l, int r, int rt) {
  c[rt].resize(r - l + 2), c[rt][0] = -inf;
  for (int i = 1; i < r - l + 2; i++) c[rt][i] = inf;
  if (l == r) {
    a[rt] = read(), c[rt][0] = -inf;
    c[rt][1] = p - a[rt];
    return;
  }
  int mid = (l + r) >> 1;
  build(l, mid, rt << 1);
  build(mid + 1, r, rt << 1 | 1);
  a[rt] = a[rt << 1] + a[rt << 1 | 1];
  int debug = 0;
  for (int i = 0, j = 1; i < mid - l + 2; i++) {
    long long L = c[rt << 1][i],
              R = i == mid - l + 1 ? inf : c[rt << 1][i + 1] - 1;
    while (j <= r - mid) {
      long long wl = c[rt << 1 | 1][j] + p * i - a[rt << 1],
                wr = (j == r - mid ? inf : c[rt << 1 | 1][j + 1] - 1) + p * i -
                     a[rt << 1];
      if (wr >= L && wl <= R) c[rt][i + j] = min(c[rt][i + j], max(wl, L));
      if (wl > R) break;
      ++j;
    }
    if (j) j--;
  }
  if (debug) {
    cout << "is " << l << ' ' << r << endl;
    for (int i = 0; i <= r - l + 1; i++) cout << c[rt][i] << ' ';
    cout << endl;
    cout << endl;
    if (debug) exit(0);
  }
}
long long query(int l, int r, int x, int y, long long z, int rt) {
  if (x <= l && y >= r) {
    int k = upper_bound(c[rt].begin(), c[rt].end(), z) - c[rt].begin() - 1;
    return z + a[rt] - p * k;
  }
  int mid = (l + r) >> 1;
  if (x <= mid) z = query(l, mid, x, y, z, rt << 1);
  if (y > mid) z = query(++mid, r, x, y, z, rt << 1 | 1);
  return z;
}
int main() {
  n = read(), m = read(), p = read(), build(1, n, 1);
  while (m--) {
    int l = read(), r = read();
    printf("%lld\n", query(1, n, l, r, 0, 1));
  }
  return 0;
}
