求助全是RE,找不出访问不了的地方
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=500010;
inline int read(){
int s=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+int(ch-'0');ch=getchar();}
return s*f;
}
#define ui unsigned int
ui s;
inline ui get(ui x) {
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
return s = x;
}
long long n,q,root,answer,outs;
int lg[maxn],cf[50];
int ycl(){
lg[0]=-1;cf[0]=1;
for(int i=1;i<=n;i++)lg[i]=lg[i/2]+1;
for(int i=1;i<=30;i++)cf[i]=cf[i-1]*2;
}
struct node{
int next,to;
}tu[maxn<<2];
int num,have[maxn];
void adds(int from,int to){
num++;
tu[num].to=to;
tu[num].next=have[from];
have[from]=num;
}
int fa[maxn][32],dep[maxn],son[maxn],len[maxn];
int cnt,to[maxn],back[maxn];
void dfs1(int now,int fas){
fa[now][0]=fas;dep[now]=dep[fas]+1;len[now]=1;
for(int i=1;;i++){
if(!fa[fa[now][i-1]][i-1])break;
fa[now][i]=fa[fa[now][i-1]][i-1];
}
for(int i=have[now];i;i=tu[i].next)
if(tu[i].to!=fas){
dfs1(tu[i].to,now);
if(len[tu[i].to]+1>len[now])
len[now]=len[tu[i].to]+1,son[now]=tu[i].to;
}
}
void dfs2(int now){
to[now]=++cnt;back[cnt]=now;
if(son[now])dfs2(son[now]);
for(int i=have[now];i;i=tu[i].next)
if(tu[i].to!=fa[now][0]&&tu[i].to!=son[now])
dfs2(tu[i].to);
}
int main(){
int x,k,fas;
n=read();q=read();cin>>s;ycl();
for(int i=1;i<=n;i++){
x=read();
if(x)adds(x,i),adds(i,x);
else root=i;
}
dfs1(root,0);dfs2(root);
for(int i=1;i<=q;i++){
x=((get(s)^answer)%n)+1;k=(get(s)^answer)%dep[x];
if(k!=0){
fas=fa[x][lg[k]];k-=cf[lg[k]];
answer=back[to[fas]-k];
}
else answer=x;
outs^=answer*i;
}
cout<<outs;
}