#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
vector<int> g[N],g1[N],G[N];
bool vis[N];
int dep[N],hvs[N],Depmax[N],fa[N][21],top[N],Log[N],n,q;
unsigned int s;
inline unsigned int get(unsigned int x) {
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
return s = x;
}
void dfs(int u,int fath){
dep[u]=dep[fath]+1,fa[u][0]=fath,hvs[u]=-1;
for(int i=1;(1<<i)<=dep[u];i++) fa[u][i]=fa[fa[u][i-1]][i-1];
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==fath) continue;
dfs(v,u); Depmax[u]=max(Depmax[u],Depmax[v]+1);
if(hvs[u]==-1||Depmax[v]>Depmax[hvs[u]]) hvs[u]=v;
}
}
void rdfs(int u,int fath,int T){
top[u]=T;
if(hvs[u]==-1) return ;
rdfs(hvs[u],u,T);
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==fath||v==hvs[u]) continue;
rdfs(v,u,v),vis[v]=true;
}
}
void init(){
for(int i=2;i<=n;i++) Log[i]=Log[i>>1]+1;
for(int i=1;i<=n;i++){
if(vis[i]==false) continue;
int now=i,now1=i;
for(int j=1;j<=Depmax[i];j++) g[i].push_back(fa[now][0]),g1[i].push_back(hvs[now1]),now=fa[now][0],now1=hvs[now1];
}
}
int main(){
cin>>n>>q>>s;
int root;
for(int i=1,x;i<=n;i++){
cin>>x;
if(x==0) root=i;
else G[i].push_back(x),G[x].push_back(i);
}
dfs(root,0),vis[root]=true,rdfs(root,0,root),init();
int lans=0,ans=0;
for(int i=1;i<=q;i++){
int x=(get(s)^lans)%n+1;
int k=(get(s)^lans)%dep[x];
if(dep[x]<k){
ans^=0,lans=0; continue;
}
int pre=k-(1<<(Log[k])),now=pre-(dep[fa[x][Log[k]]]-dep[top[fa[x][Log[k]]]]);
if(now>0) ans^=(i*g[top[fa[x][Log[k]]]][now-1]),lans=(g[top[fa[x][Log[k]]]][now-1]);
else if(now==0) ans^=(i*top[fa[x][Log[k]]]),lans=(top[fa[x][Log[k]]]);
else ans^=(i*g1[top[fa[x][Log[k]]]][-now-1]),lans=(g1[top[fa[x][Log[k]]]][-now-1]);
}
cout<<ans<<endl;
}