#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1;ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48);ch=getchar(); }
return x*f;
}
const int Maxn=2e5+5;
struct point{
int a,pos;
bool out;
}dor[Maxn],p[Maxn];
vector<int> v[Maxn];
int n,m,L,s,ans;
int sum[Maxn];
int main()
{
n=read(); m=read(); L=read();
dor[1].pos=0;
for(int i=2;i<=m;i++) dor[i].pos=read();
for(int i=1;i<=m;i++)
{
dor[i].a=read();
sum[dor[i].pos]=dor[i].a;
s+=dor[i].a;
}
for(int i=1;i<=n;i++)
{
p[i].a=read(); p[i].pos=read();
}
while(s>0)
{
for(int i=0;i<Maxn;i++) v[i].clear();
for(int i=1;i<=n;i++)
{
if(p[i].out==1) continue;
if(p[i].a==0) p[i].pos=(p[i].pos+1)%L;
else p[i].pos=(p[i].pos-1+L)%L;
if(sum[p[i].pos])
{
v[p[i].pos].push_back(i);
}
}
for(int i=1;i<=m;i++)
{
int t=v[dor[i].pos].size();
if(t<=sum[dor[i].pos])
{
s-=t;
sum[dor[i].pos]-=t;
for(int j=0;j<t;j++)
{
int tmp=v[dor[i].pos][j];
p[tmp].out=1;
// printf("1:tmp=%d i=%d\n",tmp,i);
ans^=tmp*i;
}
}
else
{
s-=sum[dor[i].pos];
sort(v[dor[i].pos].begin(),v[dor[i].pos].end());
for(int j=0;j<sum[dor[i].pos];j++)
{
int tmp=v[dor[i].pos][j];
p[tmp].out=1;
// printf("2:tmp=%d i=%d\n",tmp,i);
ans^=tmp*i;
}
sum[dor[i].pos]=0;
}
}
}
for(int i=1;i<=n;i++)
{
if(p[i].out==0)
{
ans^=i;
}
}
printf("%d",ans);
return 0;
}