#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define ff first
#define ss second
#define tri array<int, 3>
const int inf = 2e18;
const int mod = 1e9+7;
const int mxn = 2e6 + 1;
vector<int> fact(mxn+1,1),invfact(mxn+1,1);
int exp(int x, int n)
{
int res = 1;
for (; n > 0; res = (n % 2 ? res * x % mod : res), x = x * x % mod, n /= 2)
;
return res;
}
int inv(int x)
{
return exp(x, mod - 2);
}
void init()
{
for(int i = 1; i <= mxn; i++)
fact[i]=fact[i-1]*i%mod;
invfact[mxn] = inv(fact[mxn]);
for(int i = mxn-1; i >= 0; i--)
invfact[i]=invfact[i+1]*(i+1)%mod;
}
int ncr(int n,int r)
{
if(n<r ||n<0||r<0)
return 0;
return fact[n]*invfact[r]%mod*invfact[n-r]%mod;
}
struct node{
int pref=0,suf=0,mx=0,sum=0;
node operator+(node b)
{
node res(0);
res.pref=max(pref,sum+b.pref);
res.suf = max(b.sum+suf,b.suf);
res.mx = max({mx,b.mx,suf+b.pref});
res.sum =sum+b.sum;
return res;
}
node(int a)
{
pref =suf=mx=sum=a;
}
};
struct seggy{
int n;
vector<node> t;
seggy(int sz)
{
n = sz;
t.resize(2*n,node(0));
}
void update(int i,int x)
{
for(t[i+=n]=node(x);i/=2;)
t[i]=t[i<<1]+t[i<<1|1];
}
node query(int l,int r)
{
r++;
node lef(0),rig(0);
for(l+=n,r+=n;l<r;l/=2,r/=2)
{
if(l&1)lef = lef+t[l++];
if(r&1)rig = t[--r]+rig;
}
return lef+rig;
}
};
void solve()
{
int n,q,k;
cin >> n >> q >> k;
vector<int> v(n);
for(int&x:v)cin>>x;
v.push_back(0);v.push_back(0);
vector<pii> nxt(n+2,{n,0});
for(int i = 0;i < n; i+=2)
nxt[i]={i+1,v[i]/k};
seggy mile(n);
for(int i = 0; i < n; i++)
v[i]*=(i%2?-1:1),mile.update(i,v[i]);
int j = n;
if(j%2)j--;
for(int i =n-1; i >= 0; i--)
{
if(i%2==0&&i!=0)i--;
if(i<0)break;
while(j>i+1&&mile.query(i,j-2).mx>=k)
j-=2;
if(j==i+1)
nxt[i] = {j,0};
else
{
int ad = mile.query(i,j-1).suf;
nxt[i]={j+1,(ad+v[j])/k};
}
}
vector<vector<pii>> lift(20,vector<pii>(n+2,{n,0}));
lift[0] = nxt;
for(int b = 1;b < 20;b++)
for(int i = 0; i < n; i++)
{
lift[b][i].ss = lift[b-1][i].ss+lift[b-1][lift[b-1][i].ff].ss;
lift[b][i].ff = lift[b-1][lift[b-1][i].ff].ff;
}
while(q--)
{
int l,r;
cin >> l>>r;
--l,--r;
int tot = 0;
for(int b = 19;b>=0;b--)
if(lift[b][l].ff<=r+1)
{
tot+=lift[b][l].ss;
l=lift[b][l].ff;
}
cout<<tot<<'\n';
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
init();
int t=1;
//cin >>t;
while(t--)solve();
return 0;
}