#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int INF = 1e9;
void solve()
{
int n,m;cin>>n>>m;
vector<LL>w(n+1);
//记点权
for(int i=1;i<=n;i++)
cin>>w[i];
vector<vector<int>>g(n+1);
for(int i=2;i<=n;i++)
{
int x;cin>>x;
// x到i有条边
g[x].push_back(i);
}
vector<LL>f(n+1,0);
//这个dfs用于处理从1到此节点的值,即f[u]
function<void(int,int)>dfs=[&](int u,int fa)
{
if(u==1)f[u]=w[u];
else f[u]=w[u]+f[fa];
for(auto v:g[u])
{
dfs(v,u);
}
};
dfs(1,-1);
// f[u]=from 1 to u
vector<LL>dp(n+1,0);
//这个dfs1用于记录从子节点到此节点的最大值,即dp[u]
function<void(int,int)>dfs1=[&](int u,int fa)
{
dp[u]=w[u];
for(auto v:g[u])
{
dfs1(v,u);
dp[u]=max(dp[u],dp[v]+w[u]);
}
};
dfs1(1,-1);
vector<int>l(n+1,-1),r(n+1,-1);
int cnt=0;
vector<int>left(1,-1);//哪些是叶子,打上id,(cnt)
//记录dfs序,叶子节点
//l[u]表示这个节点子树中的最左边的叶子节点,r[u]表示最右的
function<void(int,int)>dfs2=[&](int u,int fa)
{
l[u]=cnt+1;//左闭
for(auto v:g[u])
{
dfs2(v,u);
}
if(g[u].size()==0)
left.push_back(u),++cnt;//每dfs到一个叶子,放到left中,id++
r[u]=cnt;//右闭
};
dfs2(1,-1);
int len=left.size();
// for(int i=1;i<left.size();i++)
// cout<<left[i]<<' ';
// for(int i=1;i<=n;i++)
// cout<<l[i]<<' '<<r[i]<<endl;
//处理前缀最大值和后缀最大值
vector<LL>pre(len),suff(len+1);
for(int i=1;i<len;i++)
pre[i]=f[left[i]],suff[i]=f[left[i]];
pre[0]=suff[len]=0;
for(int i=1;i<len;i++)
pre[i]=max(pre[i-1],pre[i]);
for(int i=len-1;i>=1;i--)
suff[i]=max(suff[i+1],suff[i]);
while(m--)
{
int a,b;cin>>a>>b;
// cout<<l[a]<<' '<<r[a]<<endl;
// cout<<dp[a]+f[b]<<endl;
LL ans=dp[a]+f[b];
//防越界?(好像没必要)
if(r[a]+1<len)
ans=max(ans,suff[r[a]+1]);
if(l[a]-1>=1)
ans=max(ans,pre[l[a]-1]);
cout<<ans<<endl;
}
}
int main()
{
ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int T = 1;
//cin>>T;
while(T --)
{
solve();
}
return 0;
}