#include <bits/stdc++.h>
using namespace std;
int a[1011];//依赖关系
int b[1011];//花费时间
int c[1011];//最小开始时间
int d[1011];//最大开始时间
int n, m;
int main()
{
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
cin >> a[i];
}
for (int i = 1; i <= m; i++)
{
cin >> b[i];
}
//求最小开始时间
for (int i = 1; i <= m; i++)
{
if (a[i] == 0)//无依赖关系,直接输出1
c[i] = 1;
else
{
c[i] = c[a[i]] + b[a[i]];//从前往后推,前驱的最小开始时间+前驱的花费时间
}
}
for (int i = 1; i <= m; i++)
cout << c[i] << " ";
//判断是否继续输出
int max_finish = 0;
for (int i = 1; i <= m; i++)
{
max_finish = max(c[i] + b[i], max_finish);
}
//是
if (max_finish <= n)
{
for (int i = m; i > 0; i--)
d[i] = n - b[i] + 1;//初始化最大值
for (int i = m; i > 0; i--)
{
d[i] = min(n - b[i] + 1, d[i]);
//虽然一个点只会有一个前驱点,但可能有多个指向它的点
//为此需取最小值
//随便看能不能更新一下前驱点
d[a[i]] = min(d[i] - b[a[i]], d[a[i]]);
}
cout << endl;
for (int i = 1; i <= m; i++)
cout << d[i] << " ";
}
}