# include <bits/stdc++.h>
# define ll long long
# define ui unsigned int
using namespace std ; const int N = 5e5 + 7 ;
int n , q , rt ; ui s ; int size[N] , top[N] , son[N] , fa[N] , dfn[N] , id[N] , tot , dep[N] ;
struct Edge { int nxt , v ; } e [ N << 1 ] ; int h[N] , cnt ;
inline void Add_Edge ( int u , int v ) { e [ ++ cnt ] . nxt = h[u] , e[cnt] . v = v , h[u] = cnt ; }
inline ui get ( ui x ) { x ^= x << 13 , x ^= x >> 17 , x ^= x << 5 ; return s = x ; }
inline void dfs1 ( int u ) {
size[u] = 1 ; for ( int i = h[u] ; i ; i = e[i] . nxt ) {
int v = e[i] . v ; dep[v] = dep[u] + 1 ; dfs1 ( v ) ; size[u] += size[v] ;
if ( size[v] > size[son[u]] ) son[u] = v ;
}
}
inline void dfs2 ( int u , int _top_ ) {
dfn[u] = ++ tot ; id[tot] = u ; top[u] = _top_ ; if ( son[u] ) dfs2 ( son[u] , _top_ ) ;
for ( int i = h[u] ; i ; i = e[i] . nxt ) { int v = e[i] . v ; if ( v == son[u] ) continue ; dfs2 ( v , v ) ; }
}
inline int jump ( int x , int k ) {
k = dep[x] - k ; while ( dep[top[x]] > k ) x = fa[top[x]] ;
return id [ dfn[x] + k - dep[x] ] ;
}
int main () {
ios :: sync_with_stdio ( false ) ; cin . tie ( 0 ) , cout . tie ( 0 ) ; cin >> n >> q >> s ; rt = 1 ;
for ( int i = 1 ; i <= n ; i++ ) { cin >> fa[i] ; if ( ! fa[i] ) rt = i ; else Add_Edge ( fa[i] , i ) ; }
dep[rt] = 1 ; dfs1 ( rt ) ; dfs2 ( rt , rt ) ; ll ans ; int lst = 0 ; for ( int i = 1 ; i <= q ; i++ ) {
int x = ( get(s) ^ lst ) % n + 1 ; int k = ( get(s) ^ lst ) % dep[x] ;
lst = jump ( x , k ) ; ans ^= 1ll * i * lst ;
}
cout << ans << "\n" ;
return 0 ;
}