RT
#include<bits/stdc++.h>
#define int long long
#define inf 0x7fffffff
#define eps 1e-9
#define PII pair<int,int>
#define fx first
#define fy second
#define mk_p make_pair
#define Set(a,b) memset(a,b,sizeof(a))
#define file(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
#define lowbit(x) x&(-x)
using namespace std;
const int maxn=2e6+5;
struct ques{
int l,r,id;
}ask[maxn];
int bit[maxn],n,m,k,p[maxn],v[maxn],ans[maxn];
vector<int>g[maxn];
inline int read(){
int ans=0,flag=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')flag=-1;ch=getchar();}
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans*flag;
}
inline string reads(){
string ss;char ch=getchar();
while(ch=='\n'||ch=='\r'||ch==' ')ch=getchar();
while(ch!='\n'&&ch!='\r'&&ch!=' '){ss+=ch;ch=getchar();}
return ss;
}
void add(int x,int y){
while(x<=n){
bit[x]+=y;
x+=lowbit(x);
}
}
int query(int x){
int res=0;
for(;x;x-=lowbit(x)) res+=bit[x];
//printf("res:%lld\n",res);
return res;
}
bool cmp(const ques& a,const ques& b){
return a.r<b.r;
}
signed main(){
n=read(),m=read(),k=read();
for(int i=1;i<=n;i++) p[i]=read();
for(int i=1;i<=n;i++) v[i]=read();
for(int i=1;i<=m;i++) ask[i].l=read(),ask[i].r=read(),ask[i].id=i;
sort(ask+1,ask+n+1,cmp);
int lst=1;
for(int i=1;i<=m;i++){
for(int j=lst;j<=ask[i].r;j++){
add(j,v[j]);
g[p[j]].push_back(j);
if(g[p[j]].size()>=k) add(g[p[j]][g[p[j]].size()-k],-v[g[p[j]][g[p[j]].size()-k]]);
}
lst=ask[i].r+1;
ans[ask[i].id]=query(ask[i].r)-query(ask[i].l-1);
}
for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
return 0;
}