#include <bits/stdc++.h>
using namespace std;
int a[1000010], id[1000010], cnt, p, len[4000010];
struct data {
  long long l, r;
  int x;
};
long long sum[4000010];
vector<data> f[4000010];
int read() {
  int tmp = 0, fh = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') fh = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    tmp = tmp * 10 + c - '0';
    c = getchar();
  }
  return tmp * fh;
}
void get_id(int now, int l, int r, int left, int right) {
  if (l == left && r == right) {
    id[++cnt] = now;
    return;
  }
  int mid = (l + r) / 2;
  if (left <= mid) get_id(now * 2, l, mid, left, min(right, mid));
  if (right >= mid + 1)
    get_id(now * 2 + 1, mid + 1, r, max(left, mid + 1), right);
}
void build(int now, int l, int r) {
  if (l == r) {
    sum[now] = a[l];
    f[now].push_back((data){-10000000000000000, p - a[l] - 1, 0});
    f[now].push_back((data){p - a[l], 10000000000000000, 1});
    len[now] = 1;
    return;
  }
  int mid = (l + r) / 2;
  build(now * 2, l, mid);
  build(now * 2 + 1, mid + 1, r);
  sum[now] = sum[now * 2] + sum[now * 2 + 1];
  int cnt = -1, cur = 0;
  for (int i = 0; i <= len[now * 2]; i++) {
    data t1 = f[now * 2][i], t2 = f[now * 2 + 1][cur];
    long long tl, tr;
    tl = t1.l + sum[now * 2] - (long long)t1.x * p;
    tr = t1.r + sum[now * 2] - (long long)t1.x * p;
    if (t1.l == -10000000000000000) tl = -10000000000000000;
    if (t1.r == 10000000000000000) tr = 10000000000000000;
    if (t2.l > tl) {
      cur--;
      t2 = f[now * 2 + 1][cur];
    } else
      while (t2.r < tl) {
        cur++;
        t2 = f[now * 2 + 1][cur];
      }
    while (t2.r < tr) {
      long long ch = t2.r + (long long)t1.x * p - sum[now * 2];
      data tmp = (data){t1.l, ch, t1.x + t2.x};
      if (cnt != -1 && f[now][cnt].x == tmp.x)
        f[now][cnt].r = tmp.r;
      else {
        f[now].push_back(tmp);
        cnt++;
      }
      cur++;
      t2 = f[now * 2 + 1][cur];
      t1.l = ch + 1;
    }
    data tmp = (data){t1.l, t1.r, t1.x + t2.x};
    if (cnt != -1 && f[now][cnt].x == tmp.x)
      f[now][cnt].r = tmp.r;
    else {
      f[now].push_back(tmp);
      cnt++;
    }
  }
  len[now] = cnt;
}
long long solve() {
  long long x = 0;
  for (int i = 1; i <= cnt; i++) {
    int lef = 0, righ = len[id[i]], ch;
    while (lef <= righ) {
      int mid = (lef + righ) / 2;
      if (x >= f[id[i]][mid].l) {
        ch = mid;
        lef = mid + 1;
      } else
        righ = mid - 1;
    }
    x = x + sum[id[i]] - (long long)f[id[i]][ch].x * p;
  }
  return x;
}
int main() {
  int n = read(), m = read();
  p = read();
  for (int i = 1; i <= n; i++) a[i] = read();
  build(1, 1, n);
  for (int i = 1; i <= m; i++) {
    int l = read(), r = read();
    cnt = 0;
    get_id(1, 1, n, l, r);
    printf("%lld\n", solve());
  }
  return 0;
}
