3个AC,2个WA,3个TLE,2个MLE
#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;
//const int mod = ;
//const int inf = ;
int n, L, q, seed, root, cnt, ans, temp, timer, tt;
int head[N], UP[N][M], Tin[N], Tout[N], dep[N];
struct edge { int to, next; } e[N];
int get(int x)
{
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
return seed = x;
}
void add(int u, int v)
{
e[ ++ cnt] = (edge){v, head[u]};
head[u] = cnt;
}
void dfs(int u, int fa)
{
dep[u] = dep[fa] + 1;
UP[u][0] = fa;
_for (i, 1, M - 1) UP[u][i] = UP[UP[u][i - 1]][i - 1];
for (int i = head[u], v; i; i = e[i].next)
{
v = e[i].to;
if (v != fa) dfs(v, u);
}
}
int climb(int u, int step)
{
tt = M - 1;
while (step && tt >= 0)
{
if (step >= (1 << tt))
step -= (1 << tt), u = UP[u][tt];
tt -- ;
}
return u;
}
signed main()
{
ios :: sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> q >> seed;
L = (int)(ceil((log2(n))));
int fa;
_for (i, 1, n)
{
cin >> fa;
if (! fa) root = i;
else add(fa, i), add(i, fa);
}
dfs(root, 0);
int x, k;
_for (i, 1, q)
{
x = ((get(seed) ^ temp) % n) + 1;
k = (get(seed) ^ temp) % dep[x];
temp = climb(x, k);
ans ^= i * temp;
// cout << "[" << i << "] " << x << " " << k << " " << temp << endl;
}
cout << ans << endl;
return 0;
}