#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <vector>
#define _for(i,a,b) for(int i=(a);i<(b);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;
typedef long long LL;
inline int read_int(){
int t=0;bool sign=false;char c=getchar();
while(!isdigit(c)){sign|=c=='-';c=getchar();}
while(isdigit(c)){t=(t<<1)+(t<<3)+(c&15);c=getchar();}
return sign?-t:t;
}
inline void write(LL x){
register char c[21],len=0;
if(!x)return putchar('0'),void();
if(x<0)x=-x,putchar('-');
while(x)c[++len]=x%10,x/=10;
while(len)putchar(c[len--]+48);
}
inline void space(LL x){write(x),putchar(' ');}
inline void enter(LL x){write(x),putchar('\n');}
const int MAXN=5e5+5,MAXM=21;
unsigned int s;
inline unsigned int get(unsigned int x){
x^=x<<13;
x^=x>>17;
x^=x<<5;
return s=x;
}
struct Edge{
int to,next;
}edge[MAXN<<1];
int head[MAXN],m;
void Insert(int u,int v){
edge[++m].to=v;
edge[m].next=head[u];
head[u]=m;
}
int d[MAXN],fa[MAXN][MAXM],log_2[MAXN];
int h_son[MAXN],mson[MAXN],p[MAXN];
vector<int> Node_up[MAXN],Node_down[MAXN];
void get_log2(){
log_2[0]=-1;
_for(i,1,MAXN)
log_2[i]=log_2[i>>1]+1;
}
void dfs_1(int u,int depth){
mson[u]=d[u]=depth;
_rep(i,1,log_2[d[u]])
fa[u][i]=fa[fa[u][i-1]][i-1];
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
dfs_1(v,depth+1);
if(mson[v]>mson[u]){
h_son[u]=v;
mson[u]=mson[v];
}
}
}
void dfs_2(int u,int top){
p[u]=top;
if(u==top){
for(int i=0,pos=u;i<=mson[u]-d[u];pos=fa[pos][0],i++)
Node_up[u].push_back(pos);
for(int i=0,pos=u;i<=mson[u]-d[u];pos=h_son[pos],i++)
Node_down[u].push_back(pos);
}
if(h_son[u])
dfs_2(h_son[u],top);
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==h_son[u])
continue;
dfs_2(v,v);
}
}
int query(int u,int k){
if(!k)return u;
u=fa[u][log_2[k]],k-=1<<log_2[k];
k-=d[u]-d[p[u]],u=p[u];
return k>=0?Node_up[u][k]:Node_down[u][-k];
}
int main()
{
int n,q,root,x,y;
cin>>n>>q>>s;
_rep(i,1,n){
fa[i][0]=read_int();
if(fa[i][0])
Insert(fa[i][0],i);
else
root=i;
}
get_log2();
dfs_1(root,0);
dfs_2(root,root);
long long tot=0,last=0;
int u,k;
_rep(i,1,q){
u=(get(s)^last)%n+1;
k=(get(s)^last)%(d[u]+1);
last=query(u,k);
tot^=last*i;
}
enter(tot);
return 0;
}