#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;
}