#include <bits/stdc++.h>
using namespace std;
const long long maxn = 1e6 + 10;
const long long INF = 1e18;
long long n, m, p, a[maxn], sum[maxn << 2];
vector<long long> Tree[maxn << 2];
inline void PushUp(long long root) {
  sum[root] = sum[root << 1] + sum[root << 1 | 1];
  long long j = 0, n1 = Tree[root << 1].size() - 2,
            n2 = Tree[root << 1 | 1].size() - 2;
  for (long long i = (0), _end_ = (Tree[root].size() - 1); i <= _end_; ++i)
    Tree[root][i] = INF;
  for (long long i = (0), _end_ = (n1); i <= _end_; ++i) {
    if (j) --j;
    long long L = Tree[root << 1][i] + sum[root << 1] - p * i;
    long long R = Tree[root << 1][i + 1] + sum[root << 1] - p * i;
    while (L >= Tree[root << 1 | 1][j + 1] && j < n2) ++j;
    while (R <= Tree[root << 1 | 1][j] && j > 0) --j;
    while (j <= n2 && L < Tree[root << 1 | 1][j + 1] &&
           Tree[root << 1 | 1][j] < R) {
      Tree[root][i + j] =
          min(Tree[root][i + j],
              max(Tree[root << 1][i],
                  Tree[root << 1 | 1][j] - sum[root << 1] + p * i));
      ++j;
    }
  }
}
inline void Build(long long root, long long l, long long r) {
  if (l == r) {
    sum[root] = a[l];
    Tree[root].push_back(-INF);
    Tree[root].push_back(p - a[l]);
    Tree[root].push_back(INF);
    return;
  }
  long long Mid = l + r >> 1;
  Build(root << 1, l, Mid);
  Build(root << 1 | 1, Mid + 1, r);
  Tree[root].resize(r - l + 3);
  PushUp(root);
}
inline void Query(long long root, long long l, long long r, long long L,
                  long long R, long long &ans) {
  if (L <= l && r <= R) {
    auto i = upper_bound(Tree[root].begin(), Tree[root].end(), ans) -
             Tree[root].begin() - 1;
    ans += sum[root] - i * p;
    return;
  }
  long long Mid = l + r >> 1;
  if (L <= Mid) Query(root << 1, l, Mid, L, R, ans);
  if (Mid < R) Query(root << 1 | 1, Mid + 1, r, L, R, ans);
}
signed main() {
  scanf("%lld%lld%lld", &n, &m, &p);
  for (long long i = (1), _end_ = (n); i <= _end_; ++i) scanf("%lld", &a[i]);
  Build(1, 1, n);
  while (m--) {
    long long l, r, ans = 0;
    scanf("%lld%lld", &l, &r);
    Query(1, 1, n, l, r, ans);
    printf("%lld\n", ans);
  }
  return 0;
}
