#include<stdio.h>
#include<vector>
typedef unsigned int ui;
ui s;inline ui get(){return s^=s<<13,s^=s>>17,s^=s<<5;}
ui f[20][500001],lg[500001],root,d[500001],h[500001],son[500001],q[500001],deg[500001],a[100001],dfn[500001],anc[500001],tp[500001],n,tot,*fa=f[0];
std::vector<ui>edge[500001];
void bfs(){
ui fr=0,tl=0;
for(ui i=1;i<=n;++i)if(fa[i])++deg[fa[i]];
for(ui i=1;i<=n;++i)if(!deg[i])q[tl++]=i;
for(;fr<tl;++fr){
if(fa[q[fr]]){
edge[fa[q[fr]]].push_back(q[fr]);
if(h[fa[q[fr]]]<h[q[fr]]+1)h[fa[q[fr]]]=h[q[fr]]+1,son[fa[q[fr]]]=q[fr];
if(!(--deg[fa[q[fr]]]))q[tl++]=fa[q[fr]];
}else root=q[fr];
}
}
void dfs(ui u,ui t){
a[dfn[u]=++tot]=u,d[u]=d[fa[u]]+1;
if(t)tp[u]=tp[fa[u]];
else{
tp[u]=u;
for(int i=0,v=u;i<h[u];++i)anc[tot+i]=v=fa[v];
}
if(son[u])dfs(son[u],1);
for(const auto&v:edge[u])
if(v!=son[u])
dfs(v,0);
}
ui query(ui u,ui k){
u=f[lg[k]][u],k-=(1<<lg[k]);
return d[u]-k>=d[tp[u]]?a[dfn[u]-k]:anc[dfn[tp[u]]-1+k+d[tp[u]]-d[u]];
}
int main(){
ui q;unsigned long long res=0;
scanf("%u%u%u",&n,&q,&s);
for(ui i=1;i<=n;++i)scanf("%d",fa+i),lg[i]=i>1?lg[i>>1]+1:0;
for(ui i=1;i<=lg[n];++i)
for(ui j=1;j<=n;++j)
f[i][j]=f[i-1][f[i-1][j]];
bfs(),dfs(root,0);
for(ui i=1,lst=0,u,k;i<=q;++i){
u=(get()^lst)%n+1,k=(get()^lst)%d[u];
res^=(unsigned long long)i*(lst=query(u,k));
}
printf("%llu",res);
return 0;
}