#include <bits/stdc++.h>
const int maxN = 10010;
struct node1
{
int pos,dir,flag;
node1(){pos=dir=flag=0;}
}person[maxN];
struct node2
{
int pos,limit;
node2(){pos=limit=0;}
}ex[maxN];
int idof[maxN];
int main()
{
int N,M,L;
scanf("%d%d%d",&N,&M,&L);
idof[0]=1;
for(int i=2;i<=M;i++)
{
scanf("%d",&ex[i].pos);
idof[ex[i].pos]=i;
}
scanf("%d",&ex[1].limit);
for(int i=2;i<=M;i++)scanf("%d",&ex[i].limit);
for(int i=1;i<=N;i++)
{
int s,b;
scanf("%d%d",&s,&b);
person[i].dir=(s==0) ? 1 : L-1;
person[i].pos=b;
}
int ans=0;
for(int loop=0;loop<=L;loop++)
{
for(int i=1;i<=N;i++)if(person[i].flag==0)
{
int curp=idof[person[i].pos];
if(ex[curp].limit>0)
{
ex[curp].limit--;
person[i].flag=1;
ans=ans^(i*curp);
}
}
for(int i=1;i<=N;i++)if(person[i].flag==0)
person[i].pos=(person[i].pos+person[i].dir)%L;
}
printf("%d",ans);
}
rt