This problem is quite complex; it gives you DFS and BFS and asks you to construct a tree.
Moreover, this tree does not have to be binary; it can be multi-way.
The problem also states that if there are many answers, printing one is sufficient.
Utilize the characteristics of BFS to segment, and use DFS to determine the child nodes owned by each parent node.
//====================================================================||
// ||
// ||
// Author : GCA ||
// 6AE7EE02212D47DAD26C32C0FE829006 ||
//====================================================================||
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <climits>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <cctype>
#include <utility>
using namespace std;
#ifdef ONLINE\_JUDGE
#define ll "%lld"
#else
#define ll "%I64d"
#endif
typedef unsigned int uint;
typedef long long int Int;
#define Set(a,s) memset(a,s,sizeof(a))
#define Write(w) freopen(w,"w",stdout)
#define Read(r) freopen(r,"r",stdin)
#define Pln() printf("\\n")
#define I\_de(x,n)for(int i=0;i<n;i++)printf("%d ",x\[i\]);Pln()
#define De(x)printf(#x"%d\\n",x)
#define For(i,x)for(int i=0;i<x;i++)
#define CON(x,y) x##y
#define Pmz(dp,nx,ny)for(int hty=0;hty<ny;hty++){for(int htx=0;htx<nx;htx++){\\
printf("%d ",dp\[htx\]\[hty\]);}Pln();}
#define M 1005
#define PII pair<int,int\>
#define PB push\_back
#define oo INT\_MAX
#define Set\_oo 0x3f
#define Is\_debug true
#define debug(...) if(Is\_debug)printf("DEBUG: "),printf(\_\_VA\_ARGS\_\_)
#define FOR(it,c) for(typeid((c).begin()) it=(c).begin();it!=(c).end();it++)
#define eps 1e-6
bool xdy(double x,double y){return x>y+eps;}
bool xddy(double x,double y){return x>y-eps;}
bool xcy(double x,double y){return x<y-eps;}
bool xcdy(double x,double y){return x<y+eps;}
int min3(int x,int y,int z){
int tmp=min(x,y);
return min(tmp,z);
}
int max3(int x,int y,int z){
int tmp=max(x,y);
return max(tmp,z);
}
int n;
int x\[M\];
int y\[M\];
vector<int\> ans\[M\];
vector<int\> pos\[M\];
vector<int\> have\[M\];
void bt(int h,int s){
// debug("%d\\n",h);
// for(int i=1;i<=n;i++){
// printf("%d :",i);
// for(int j=0;j<have\[i\].size();j++){
// printf("%d ",have\[i\]\[j\]);
// }Pln();
// }Pln();
int record=-1;
int rej=-1;
bool f=true;
for(int i=s;i<n;i++){
bool ha=false;
int j;
for(j=0;j<have\[h\].size();j++){
if(have\[h\]\[j\]==x\[i\]){
ha=true;
break;
}
}
if(ha&&x\[i\]>record&&j>rej){
f=false;
record=x\[i\];
rej=j;
ans\[h\].PB(x\[i\]);
pos\[h\].PB(j);
}
else if(!f)break;
}
for(int i=0;i<pos\[h\].size();i++){
int tmp=(i==pos\[h\].size()-1)?have\[h\].size():pos\[h\]\[i+1\];
for(int j=pos\[h\]\[i\]+1;j<tmp;j++){
have\[ans\[h\]\[i\]\].PB(have\[h\]\[j\]);
}
bt(ans\[h\]\[i\],s+pos\[h\].size());
}
return ;
}
void solve(){
for(int i=1;i<n;i++){
have\[x\[0\]\].PB(y\[i\]);
}
bt(x\[0\],1);
for(int i=1;i<=n;i++){
printf("%d:",i);
for(int j=0;j<ans\[i\].size();j++)printf(" %d",ans\[i\]\[j\]);
Pln();
}
}
void clear(){
for(int i=0;i<=n;i++){
have\[i\].clear();
ans\[i\].clear();
pos\[i\].clear();
}
}
int main() {
ios\_base::sync\_with\_stdio(0);
while(~scanf("%d",&n)){
for(int i=0;i<n;i++)scanf("%d",&x\[i\]);
for(int i=0;i<n;i++)scanf("%d",&y\[i\]);
solve();
clear();
}
}