#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define int long long
using namespace std;
signed main()
{
IOS;
int n,q;
cin>>n>>q;
vector<int>a(n+5),f(n+5);
vector<int>sz(n+5,0),pre(n+5,0);//sz[u]表示以u节点为根的子树中根到叶子的最大简单路径,pre[u]表示根到u节点简单路径的长度
for(int i=1;i<=n;i++){
cin>>a[i];
sz[i]=a[i];
pre[i]=a[i];
}
vector<vector<int>>e(n+5);
for(int v=2;v<=n;v++){
int u;
cin>>u;
f[v]=u;
e[u].push_back(v);
e[v].push_back(u);
}
vector<int>dfn(n+5,0),re_dfn(n+5,0);//dfn[u]是节点u映射到dfn,re_dfn[dfn[u]]是dfn映射到节点u
vector<int>r_dfn(n+5,0);//r_dfn[u]是退出以u节点为根的子树跑过的最后一个节点的dfn序的大小
int id=1;
auto dfs=[&](auto &&dfs,int u,int f)->void{
dfn[u]=id;
r_dfn[u]=dfn[u];
re_dfn[dfn[u]]=u;
for(auto v:e[u]){
if(v==f) continue;
pre[v]+=pre[u];
id++;
dfs(dfs,v,u);
r_dfn[u]=max(r_dfn[u],r_dfn[v]);
sz[u]=max(sz[u],a[u]+sz[v]);
}
};
dfs(dfs,1,0);
vector<int>pre_max(n+5,0),ne_max(n+5,0);//前缀最大值和后缀最大值
for(int i=1;i<=n;i++){
pre_max[i]=max(pre_max[i-1],pre[re_dfn[i]]);//前嘴处理对应dfn序的节点的简单路径长度
}
for(int i=n;i>=1;i--){
ne_max[i]=max(ne_max[i+1],pre[re_dfn[i]]);//前嘴处理对应dfn序的节点的简单路径长度
}
for(int i=1;i<=q;i++){
int x,y;
cin>>x>>y;
int tl=pre_max[dfn[x]-1];
int tr=ne_max[r_dfn[x]+1];
int tans=max(tl,tr);//剩下的简单路径的最大值
int sans=pre[y]+sz[x];//新增的简单路径的最大值
int ans=max(tans,sans);//两者取最大
cout<<ans<<'\n';
}
return 0;
}