#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N = 110,M=2*N,mod=1e9+7;
int n,m;
int p[N],ti[N],d[N];
int start[N],ed[N];
bool st[N];
int h[N],e[M],ne[M],idx;
void add(int a,int b) {
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int dfs(int u) {
int minn=n+1;
for(int i=h[u];i!=-1;i=ne[i]) {
int j=e[i];
minn=min(minn,dfs(j));
}
ed[u]=minn-ti[u];
minn-=ti[u];
return minn;
}
void solve() {
cin >> n >> m;
vector<vector<int>> v1(N+10);
queue<pair<int,int>> q;
for(int i=1;i<=m;i++) {
cin >> p[i];
if(p[i]!=0) {
v1[p[i]].push_back(i);
}
else q.push({i,1});
}
for(int i=1;i<=m;i++) cin >> ti[i];
bool flag=true;
while(q.size()) { //每一个项目最多依赖一个其他的项目
auto t=q.front();
q.pop();
int id=t.first,day=t.second;
start[id]=day;
day+=ti[id]-1;
if(day>n) flag=false;
for(int i=0;i<v1[id].size();i++) {
q.push({v1[id][i],day+1});
}
}
for(int i=1;i<=m;i++) cout << start[i] << " ";
cout << endl;
if(flag) { //求每一个最晚完成时间,dfs一下
memset(st,false,sizeof st);
memset(h,-1,sizeof h);
vector<int> v2;
for(int i=1;i<=m;i++) {
st[p[i]]=true;
if(p[i]!=0) add(p[i],i);
else v2.push_back(i);
}
for(int i=0;i<v2.size();i++) {
dfs(v2[i]);
}
for(int i=1;i<=m;i++) cout << ed[i] << " ";
cout << endl;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
//cin >> t;
t=1;
while(t--) {
solve();
}
return 0;
}
数据范围很小,顺着往后推。