#include <bits/stdc++.h>
using namespace std;
const int RLEN = 1 << 20 | 1;
inline char gc() {
  static char ibuf[RLEN], *ib, *ob;
  (ob == ib) && (ob = (ib = ibuf) + fread(ibuf, 1, RLEN, stdin));
  return (ob == ib) ? EOF : *ib++;
}
inline int read() {
  char ch = getchar();
  int res = 0, f = 1;
  while (!isdigit(ch)) f ^= ch == '-', ch = getchar();
  while (isdigit(ch)) res = (res + (res << 2) << 1) + (ch ^ 48), ch = getchar();
  return f ? res : -res;
}
inline void chemx(long long &a, long long b) { a < b ? a = b : 0; }
inline void chemn(long long &a, long long b) { a > b ? a = b : 0; }
struct node {
  long long l, b;
  node(long long _l = 0, long long _b = 0) : l(_l), b(_b) {}
};
const long long N = 1000005;
const long long inf = 1e15;
long long n, m;
long long mod, a[N];
inline void merge(vector<node> &res, vector<node> a, vector<node> b) {
  for (long long i = 0, j = 0; i < a.size();) {
    long long vl = (a[i].l == inf ? -inf : a[i].l + a[i].b),
              vr = (i + 1 == a.size() ? inf : a[i + 1].l - 1 + a[i].b);
    while (j && b[j].l > vl) j--;
    while (j + 1 < b.size() && b[j + 1].l - 1 < vl) j++;
    long long mxr = (j + 1 == b.size() ? inf : b[j + 1].l - 1);
    if (mxr < vr) {
      if (!res.size() || res.back().b != a[i].b + b[j].b)
        res.push_back(node(a[i].l, a[i].b + b[j].b));
      a[i].l = mxr - a[i].b + 1;
    } else {
      if (!res.size() || res.back().b != a[i].b + b[j].b)
        res.push_back(node(a[i].l, a[i].b + b[j].b));
      i++;
    }
  }
}
namespace Seg {
vector<node> tr[N << 2];
inline long long calc(const vector<node> &a, long long x) {
  long long l = 0, r = (long long)a.size() - 1, pos = 0;
  while (l <= r) {
    long long mid = (l + r) >> 1;
    if (a[mid].l <= x)
      l = mid + 1, pos = mid;
    else
      r = mid - 1;
  }
  return x + a[pos].b;
}
inline void pushup(long long u) {
  merge(tr[u], tr[(u << 1)], tr[((u << 1) | 1)]);
}
void build(long long u, long long l, long long r) {
  if (l == r) {
    tr[u].push_back(node(-inf, a[l])),
        tr[u].push_back(node(mod - a[l], a[l] - mod));
    return;
  }
  build((u << 1), l, ((l + r) >> 1)),
      build(((u << 1) | 1), ((l + r) >> 1) + 1, r);
  pushup(u);
}
inline long long query(long long u, long long l, long long r, long long st,
                       long long des, long long v) {
  if (st <= l && r <= des) return calc(tr[u], v);
  if (st <= ((l + r) >> 1)) v = query((u << 1), l, ((l + r) >> 1), st, des, v);
  if (((l + r) >> 1) < des)
    v = query(((u << 1) | 1), ((l + r) >> 1) + 1, r, st, des, v);
  return v;
}
}  // namespace Seg
signed main() {
  n = read(), m = read(), mod = read();
  for (long long i = 1; i <= n; i++) a[i] = read();
  Seg::build(1, 1, n);
  while (m--) {
    long long l = read(), r = read();
    cout << Seg::query(1, 1, n, l, r, 0) << '\n';
  }
}
