1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| #include<bits/stdc++.h> #define maxn 500005 #define ll long long #define put() putchar('\n') using namespace std; inline void read(int &x){ int f=1;x=0;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();} x*=f; } #define ui unsigned int ui s; inline ui get(ui x) { x ^= x << 13; x ^= x >> 17; x ^= x << 5; return s = x; } int n,q; int h[maxn],head=1; struct yyy{ int to,z; inline void add(int x,int y) { to=y;z=h[x];h[x]=head; } }a[maxn*2]; vector<int>ff[maxn],fs[maxn]; int fa[maxn][21],top[maxn],deep[maxn],lg[maxn],hh[maxn],son[maxn],maxdeep[maxn]; inline void dfs(int x,int pre) { int i;deep[x]=deep[pre]+1;fa[x][0]=pre; for (i=1;i<=lg[deep[x]];i++) fa[x][i]=fa[fa[x][i-1]][i-1]; for (i=h[x];i;i=a[i].z) { dfs(a[i].to,x); if (maxdeep[x]<maxdeep[a[i].to]+1) { maxdeep[x]=maxdeep[a[i].to]+1; son[x]=a[i].to; } } } inline void dfs2(int x,int pre,int v) { int i;top[x]=v; if (x^v) fs[v].push_back(x); if (!son[x]) return ; dfs2(son[x],x,v); for (i=h[x];i;i=a[i].z) if (a[i].to^son[x]){ dfs2(a[i].to,x,a[i].to); int j,now=x; for (j=1;j<=maxdeep[a[i].to];j++) if (!now) break; else ff[a[i].to].push_back(now),now=fa[now][0]; } } signed main(void){
int i,j,now,x,k,root; ll ans=0,lasans=0; read(n);read(q);scanf("%u",&s); for (i=1;i<=n;i++) { read(x); if (!x) root=i; else a[++head].add(x,i); } for (i=2;i<=n;i++) lg[i]=lg[i/2]+1; for (h[0]=0,i=1;i<=n;i++) hh[i]=1<<lg[i]; dfs(root,0); dfs2(root,0,root); for (i=1;i<=q;i++) { x=((get(s)^lasans)%n)+1;k=(get(s)^lasans)%deep[x]; if (k==0) {lasans=x;ans^=(i*lasans);continue;} x=fa[x][lg[k]];k=k-hh[k]+deep[top[x]]-deep[x];int now=top[x]; if (k==0) lasans=now; else if (k<0) lasans=fs[now][-k-1]; else lasans=ff[now][k-1]; ans^=(i*lasans); } printf("%lld\n",ans); return 0; }
|