解析:
记录每个点的父节点和子节点,从新的根节点开始遍历,遍历所有的非父结点即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e4+5;
int n,r1,r2,a[N];
int h[N],e[N],ne[N],idx;
int res[N];
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u,int fa){
res[u]=fa;
if(a[u]!=fa) dfs(a[u],u);
for(int i=h[u];~i;i=ne[i]){
if(e[i]!=fa) dfs(e[i],u);
}
}
int main(){
scanf("%d%d%d",&n,&r1,&r2);
memset(h,-1,sizeof h);
for(int i=1;i<=n;i++){
if(i==r1) continue;
scanf("%d",&a[i]);
add(a[i],i);
}
dfs(r2,-1);
for(int i=1;i<=n;i++){
if(i!=r2) printf("%d ",res[i]);
}
return 0;
}