求调,为什么最后五个点全部TLE了QAQ。
#include<bits/stdc++.h>
using namespace std;
int root,fa[500005],son[500005],siz[500005],deep[500005],dfn[500005],id[500005],top[500005],cnt=0;
int ans[500005];
vector<int> g[500005];
void get(int u,int father){
deep[u]=deep[father]+1,siz[u]=1,fa[u]=father;
for(int i:g[u]){
if(i==father) continue;
else{
get(i,u);
siz[u]+=siz[i];
if(siz[i]>siz[son[u]]) son[u]=i;
}
}
}
void dfs(int u,int t){
dfn[u]=++cnt,id[cnt]=u,top[u]=t;
if(son[u]==0) return;
dfs(son[u],t);
for(int i:g[u]){
if(i==fa[u]||i==son[u]) continue;
else dfs(i,i);
}
}
#define uint unsigned int
uint s;
inline uint getnum(uint x) {
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
return s = x;
}
int findans(int x,int k){
if(k==0) return x;
else if(k>=deep[x]) return 0;
while(k>=deep[x]-deep[top[x]]+1) k-=(deep[x]-deep[top[x]]+1),x=fa[top[x]];
return id[dfn[x]-k];
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n,q;
cin>>n>>q>>s;
for(int i=1;i<=n;i++){
int a;
cin>>a;
if(a!=0) g[a].push_back(i),g[i].push_back(a);
else root=i;
}
get(root,0);
dfs(root,root);
long long sum=0;
for(int i=1;i<=q;i++){
int x=(getnum(s)^ans[i-1])%n+1;
int k=(getnum(s)^ans[i-1])%deep[x];
ans[i]=findans(x,k);
sum^=(ans[i]*1ll*i);
}
cout<<sum;
return 0;
}