#include<bits/stdc++.h>
using namespace std;
#define ui unsigned int
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
inline void write(int x){
if(x==0){putchar('0');return;}
int len=0,k1=x,c[10005];
if(k1<0)k1=-k1,putchar('-');
while(k1)c[len++]=k1%10+'0',k1/=10;
while(len--)putchar(c[len]);
}
const int N=5e5+5;
ui s;
inline ui get(ui x){
x^=x<<13;
x^=x>>17;
x^=x<<5;
return s=x;
}
int fa[N],siz[N],dep[N],top[N],h[N],id[N],dfn[N],sum,rt;
vector<int>edge[N];
void dfs1(int x){
siz[x]=1;
for(int i=0;i<edge[x].size();i++){
dep[edge[x][i]]=dep[x]+1;
dfs1(edge[x][i]);
siz[x]+=siz[edge[x][i]];
if(siz[h[x]]<siz[edge[x][i]])h[x]=edge[x][i];
}
}
void dfs2(int x){
dfn[x]=++sum,id[sum]=x,top[h[x]]=top[x];
if(h[x])dfs2(h[x]);
for(int i=0;i<edge[x].size();i++){
if(edge[x][i]!=h[x]){
top[edge[x][i]]=edge[x][i];
dfs2(edge[x][i]);
}
}
}
int jump(int x,int k){
while(k>=dfn[x]-dfn[top[x]]+1&&x!=rt){
k-=(dfn[x]-dfn[top[x]]+1);
x=fa[top[x]];
}
return id[dfn[x]-k];
}
signed main(){
int n=read(),m=read();cin>>s;
for(int i=1;i<=n;i++){
fa[i]=read();
if(fa[i]==0)rt=i;
edge[fa[i]].push_back(i);
}
dep[rt]=1,top[rt]=rt;
dfs1(rt),dfs2(rt);
long long ans=0;int lstans=0;
for(int i=1;i<=m;i++){
int x=(get(s)^lstans)%n+1;
int k=(get(s)^lstans)%dep[x];
lstans=jump(x,k);
//cout<<get(s)<<" "<<dep[x]<<" "<<x<<" "<<k<<" "<<lstans<<"\n";
ans^=(long long)i*lstans;
}
cout<<ans;
return 0;
}
对于样例,我的代码会输出 2 ?