https://atcoder.jp/contests/abc371/submissions/57783392
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fr first
#define sc second
int read(){
int res=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') {res=res*10+(c-'0');c=getchar();}
return res*f;
}
const int N=2e5+5;
int n=read(),a[N],b[N],g,c[N];
int fa[N],siz[N],vis[N];
vector<int>e[N];
int find(int x){
if (fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
signed main(){
for (int i=1;i<=n;i++)
fa[i]=i,siz[i]=1;
for (int i=1;i<=n;i++){
a[i]=read();
int x=find(i),y=find(a[i]);
if (x!=y) fa[x]=y,siz[y]+=siz[x];
}
for (int i=1;i<=n;i++)
b[i]=read();
g=siz[find(1)];
for (int i=2;i<=n;i++)
g=__gcd(g,siz[find(i)]);
for (int i=1;i<=n;i++){
if (vis[find(i)])
continue;
int x=i,cc=0;
do{
c[x]=cc++;
e[find(i)].push_back(b[x]),x=a[x];
}while (x!=i);
vis[find(i)]=1;
}
for (int i=1;i<=n;i++)
vis[i]=0;
int mn=1e18,id=-1;
for (int i=0;i<(int)e[find(1)].size();i++)
if (e[find(1)][i]<mn) mn=e[find(1)][i],id=i;
vector<int>_e;
for (int i=id;i<(int)e[find(1)].size();i++)
_e.push_back(e[find(1)][i]);
for (int i=0;i<id;i++)
_e.push_back(e[find(1)][i]);
e[find(1)]=_e;
vis[find(1)]=1;
id%=g;
for (int i=1;i<=n;i++){
int x=find(i),_mn=1e18,_id=-1;
if (vis[x]) continue;
for (int i=0;i<(int)e[x].size();i+=g)
if (e[x][(i+id)%e[x].size()]<_mn)
_mn=e[x][(i+id)%e[x].size()],_id=i;
_e.clear();
for (int i=_id;i<(int)e[x].size();i++)
_e.push_back(e[x][(i+id)%e[x].size()]);
for (int i=0;i<_id;i++)
_e.push_back(e[x][(i+id)%e[x].size()]);
e[x]=_e;vis[x]=1;
}
for (int i=1;i<=n;i++)
cout<<e[find(i)][c[i]]<<' ';
return 0;
}