#include <bits/stdc++.h>
#define ll long long
#define ls (st<<1)
#define rs ((st<<1)|1)
#define xm ((xl+xr)>>1)
using namespace std;
const int N=1e6+5;
const ll M=1e10;
int n,q,m,a[N],b[N],f[22][N],aa,ab,p,pq;
ll l,g[N];
vector<int>ksbz;
struct qw{
int a,b,id;
ll l;
}a[N];
struct qwe{
ll mi,la;
void tag(ll D){
la+=D,mi-=D;
}
}t[N<<2];
bool cmp(qw aa,qw ab){
return aa.a<ab.a;
}
void jianshu(int st,int xl,int xr){
if(xl==xr){
t[st].mi=g[xl]+t[xl];
return;
}
jianshu(ls,xl,xm);
jianshu(rs,xm+1,xr);
t[st].mi=min(t[ls].mi,t[rs].mi);
}
void update(int st,int xl,int xr,int L,int R,ll D){
if(L<=xl&&xr<=R){
t[st].tag(D);
return;
}
if(t[st].la){
t[ls].tag(t[st].la);
t[rs].tag(t[st].la);
t[st].la=0;
}
if(L<=xm){
update(ls,xl,xm,L);
}
if(xm+1<=R){
update(rs,xm+1,xr,L);
}
t[st].mi=min(t[ls].mi,t[rs].mi);
}
ll query(int st,int xl,int xr,int R){
if(xr<=R){
return t[st].mi;
}
if(t[st].la){
t[ls].tag(t[st].la);
t[rs].tag(t[st].la);
t[st].la=0;
}
if(R<=xm){
return query(ls,xl,xm,R);
}else{
ll re=query(rs,xm+1,xr,R);
return min(t[ls].mi,re);
}
}
int main(){
// freopen("trip.in","r",stdin);
// freopen("trip.out","w",stdout);
// ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>q>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=n;i++){
int le=1,ri=i,an;
while(le<=ri){
int mi=(le+ri)>>1;
if(a[i]-a[mi]>m){
le=mi+1;
}else{
an=mi;
ri=mi-1;
}
}
f[0][i]=an;
}
for(int i=1;i<=21;i++){
for(int j=1;j<=n;j++){
f[i][j]=f[i-1][f[i-1][j]];
}
}
for(int i=1;i<=q;i++){
cin>>aa>>ab;
a[i]={aa,ab,i,0};
if(aa<=ab){
a[i].l=1;
continue;
}
l=0,p=21;
while(p>=0){
if(f[p][aa]>ab){
l+=(1<<p);
aa=f[p][aa];
}
p--;
}
l++;
aa=f[0][aa];
if(aa>ab){
a[i].l=0x3f3f3f3f3f3f3f3f;
}else{
a[i].l=l;
}
}
sort(a+1,a+n+1,cmp);
for(int i=2;i<=n;i++){
if(f[0][i]==i){
g[i]=g[i-1]+M;
ksbz.push_back(i);
}else{
g[i]=g[f[0][i]]+1;
}
}
ksbz.push_back(n+1);
jianshu(1,1,n);
p=1;
for(int i=1;i<=n;i++){
while(a[p].a==i){
p++;
}
}
return 0;
}