#include <bits/stdc++.h>
#define int unsigned int
#define _for(i, a, b) for (int i = (a); i <= (b); i ++ )
#define _all(i, a, b) for (int i = (a); i >= (b); i -- )
using namespace std;
const int N = 5e5 + 5;
const int M = 22;
int n, L, q, seed, root, ans, temp, cnt;
int head[N], dep[N], son[N], sz[N], UP[N][M], fa[N], htop[N], BB[N];
vector<int> up[N], down[N];
struct edge { int to, next; } e[N];
inline int get(int x)
{
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
return seed = x;
}
inline void add(int u, int v)
{
e[ ++ cnt] = (edge){v, head[u]};
head[u] = cnt;
}
void dfs1(int u, int tt)
{
dep[u] = dep[tt] + 1;
son[u] = 0;
UP[u][0] = tt;
fa[u] = tt;
_for (j, 1, L) UP[u][j] = UP[UP[u][j - 1]][j - 1];
for (int i = head[u]; i; i = e[i].next) if (e[i].to != tt)
{
int v = e[i].to;
dfs1(v, u);
if (! son[u] || sz[son[u]] < sz[v]) son[u] = v;
}
sz[u] = son[u] ? sz[son[u]] + 1 : 1;
}
void dfs2(int u, int tt, int top)
{
htop[u] = top;
if (u == top)
{
for (int v = u; v; v = son[v])
down[u].push_back(v);
for (int v = u; v && up[u].size() < down[u].size(); v = fa[v])
up[u].push_back(v);
}
if (son[u]) dfs2(son[u], u, top);
for (int i = head[u]; i; i = e[i].next) if (e[i].to != tt && e[i].to != son[u])
dfs2(e[i].to, u, e[i].to);
}
inline int solve(int u, int k)
{
if (dep[u] <= k) return 0;
if (k == 0) return u;
u = UP[u][BB[k]];
k -= 1 << BB[k];
int d = dep[u] - k - dep[htop[u]];
return d >= 0 ? down[htop[u]][d] : up[htop[u]][- d];
}
signed main()
{
ios :: sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> q >> seed;
L = (int)(ceil((log2(n))));
int a;
_for (i, 1, n)
{
cin >> a;
if (! a) root = i;
else add(i, a), add(a, i);
}
BB[1] = 0;
_for (i, 2, n) BB[i] = BB[i >> 1] + 1;
dfs1(root, 0);
dfs2(root, 0, root);
int x, k, ggg = 0;
_for (i, 1, q)
{
x = ((get(seed) ^ ggg) % n) + 1;
k = (get(seed) ^ ggg) % dep[x];
ggg = solve(x, k);
ans ^= i * ggg;
}
cout << ans << endl;
return 0;
}