#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 50;
const long long INF = 1e15;
int n, m, p, a[N];
namespace SGT {
const int N = ::N << 2;
vector<long long> S[N];
long long Ans, Sm[N];
void build(int x, int l, int r) {
  if (l == r) {
    S[x].push_back(-INF);
    S[x].push_back(p - a[l]);
    Sm[x] = a[l];
    return;
  }
  build(x << 1, l, ((l + r) >> 1));
  build(x << 1 | 1, ((l + r) >> 1) + 1, r);
  S[x].resize(r - l + 2, INF);
  S[x][0] = -INF;
  for (int i = 0, j = 0, ls = S[x << 1].size(), rs = S[x << 1 | 1].size();
       i < ls; i++) {
    long long xl = S[x << 1][i],
              xr = (i + 1 == ls) ? INF : S[x << 1][i + 1] - 1;
    long long yl = xl + Sm[x << 1] - (long long)i * p,
              yr = xr + Sm[x << 1] - (long long)i * p;
    while (j > 0 && S[x << 1 | 1][j] > yl) --j;
    while (j < rs && S[x << 1 | 1][j] <= yl) ++j;
    if (j) --j;
    while (j < rs && S[x << 1 | 1][j] <= yr)
      S[x][i + j] = min(S[x][i + j], max(xl, S[x << 1 | 1][j] - Sm[x << 1] +
                                                 (long long)i * p)),
               ++j;
  }
  Sm[x] = Sm[x << 1] + Sm[x << 1 | 1];
}
long long trans(int x, long long t) {
  int o = upper_bound(S[x].begin(), S[x].end(), t) - S[x].begin() - 1;
  return t + Sm[x] - (long long)p * o;
}
void query(int x, int l, int r, int L, int R) {
  if (L <= l && r <= R) return Ans = trans(x, Ans), void();
  if (L <= ((l + r) >> 1)) query(x << 1, l, ((l + r) >> 1), L, R);
  if (R > ((l + r) >> 1)) query(x << 1 | 1, ((l + r) >> 1) + 1, r, L, R);
}
long long query(int l, int r) {
  Ans = 0;
  query(1, 1, n, l, r);
  return Ans;
}
}  // namespace SGT
int main() {
  scanf("%d%d%d", &n, &m, &p);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  SGT::build(1, 1, n);
  int l, r;
  while (m--) {
    scanf("%d%d", &l, &r);
    cout << SGT::query(l, r) << '\n';
  }
  return 0;
}
