#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define endl '\n'
#define ui unsigned int
#define int long long
ui s;
inline ui get(ui x) {
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
return s = x;
}
const int N = 5e5 + 5;
int n, q;
int son[N], dep[N], maxdep[N], fa[N][20], lg[N];
vector<int> T[N];
int bel[N], num[N];
vector<int> lk[N];
void dfs1(int u, int p) {
dep[u] = dep[p] + 1;
maxdep[u] = dep[u];
fa[u][0] = p;
for (int k = 1; k <= 20 && 1 << k <= dep[u]; k++)
fa[u][k] = fa[fa[u][k - 1]][k - 1];
for (int &v : T[u]) {
dfs1(v, u);
if (maxdep[v] > maxdep[son[u]]) son[u] = v;
}
maxdep[u] = max(maxdep[u], maxdep[son[u]] + 1);
}
void dfs2(int u, int tpk) {
bel[u] = tpk;
lk[tpk].push_back(u);
num[u] = lk[tpk].size();
if (son[u]) dfs2(son[u], tpk);
for (int &v : T[u]) {
if (v == son[u] || v == fa[u][0]) continue;
dfs2(v, v);
}
}
int solve(int x, int k) {
if (k == 0) return x;
int step = lg[k];
k -= 1 << step;
x = fa[x][step];
if (k == 0) return x;
if (k < num[x]) return lk[bel[x]][num[x] - k - 1];
k -= num[x] - 1;
x = bel[x];
k--;
x = fa[x][0];
return lk[bel[x]][num[x] - k - 1];
}
signed main() {
IOS;
int root;
cin >> n >> q >> s;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
if (!x) root = i;
T[x].push_back(i);
}
dep[root] = 0;
dfs1(root, root);
dfs2(root, root);
lg[1] = 0;
for (int i = 2; i <= n; i++) lg[i] = lg[i >> 1] + 1;
int ans = 0, res = 0;
for (int i = 1; i <= q; i++) {
int x = ((get(s) ^ ans) % n) + 1;
int k = (get(s) ^ ans) % dep[x];
ans = solve(x, k);
res ^= i * ans;
}
cout <<res << endl;
return 0;
}