#include<bits/stdc++.h>
using namespace std;
int n,q,fa[200005],maxv[200005],maxp[200005],maxv1[200005],maxp1[200005];
int maxl[200005],maxpl[200005],maxl1[200005],maxpl1[200005],ff[200005],ff1[200005],sz[200005],vis[200005];
int maxv2[200005],maxp2[200005];
vector<int> g[200005];
struct node{
int b,l;
}a[200005];
set<pair<int,int>> s[200005];
void dfs(int u){
maxv[u]=a[u].b;
maxp[u]=u;
maxl[u]=a[u].l;
maxpl[u]=u;
sz[u]=1;
for(auto v:g[u]){
dfs(v);
sz[u]+=sz[v];
if(maxv[u]<maxv[v]){
maxv2[u]=maxv1[u];
maxp2[u]=maxp1[u];
maxv1[u]=maxv[u];
maxp1[u]=maxp[u];
maxv[u]=maxv[v];
maxp[u]=maxp[v];
}else if(maxv1[u]<maxv[v]&&maxv[v]<maxv[u]){
maxv2[u]=maxv1[u];
maxp2[u]=maxp1[u];
maxv1[u]=maxv[v];
maxp1[u]=maxp[v];
}else if(maxv2[u]<maxv[v]&&maxv[v]<maxv1[u]){
maxv2[u]=maxv[v];
maxp2[u]=maxp[v];
}
if(maxv[u]<maxv1[v]){
maxv2[u]=maxv1[u];
maxp2[u]=maxp1[u];
maxv1[u]=maxv[u];
maxp1[u]=maxp[u];
maxv[u]=maxv1[v];
maxp[u]=maxp1[v];
}else if(maxv1[u]<maxv1[v]&&maxv1[v]<maxv[u]){
maxv2[u]=maxv1[u];
maxp2[u]=maxp1[u];
maxv1[u]=maxv1[v];
maxp1[u]=maxp1[v];
}else if(maxv2[u]<maxv1[v]&&maxv1[v]<maxv1[u]){
maxv2[u]=maxv1[v];
maxp2[u]=maxp1[v];
}
if(maxv[u]<maxv2[v]){
maxv2[u]=maxv1[u];
maxp2[u]=maxp1[u];
maxv1[u]=maxv[u];
maxp1[u]=maxp[u];
maxv[u]=maxv2[v];
maxp[u]=maxp2[v];
}else if(maxv1[u]<maxv2[v]&&maxv2[v]<maxv[u]){
maxv2[u]=maxv1[u];
maxp2[u]=maxp1[u];
maxv1[u]=maxv2[v];
maxp1[u]=maxp2[v];
}else if(maxv2[u]<maxv2[v]&&maxv2[v]<maxv1[u]){
maxv2[u]=maxv2[v];
maxp2[u]=maxp2[v];
}
if(maxl[u]<maxl[v]){
maxl1[u]=maxl[u];
maxpl1[u]=maxpl[u];
maxl[u]=maxl[v];
maxpl[u]=maxpl[v];
}else if(maxl1[u]<maxl[v]&&maxl[v]<maxl[u]){
maxl1[u]=maxl[v];
maxpl1[u]=maxpl[v];
}
if(maxl[u]<maxl1[v]){
maxl1[u]=maxl[u];
maxpl1[u]=maxpl[u];
maxl[u]=maxl1[v];
maxpl[u]=maxpl1[v];
}else if(maxl1[u]<maxl1[v]&&maxl1[v]<maxl[u]){
maxl1[u]=maxl1[v];
maxpl1[u]=maxpl1[v];
}
s[u].insert({maxl[v],maxpl[v]});
s[u].insert({maxl1[v],maxpl1[v]});
}
int cnt=0;
if(a[u].b==maxv[u]){
cnt++;
}
for(auto v:g[u]){
if(maxv[u]==maxv[v]){
cnt++;
vis[u]|=vis[v];
}
}
if(cnt>=2){
vis[u]=1;
}
s[u].insert({a[u].l,u});
for(auto v:g[u]){
if(s[u].empty())continue;
auto it=--s[u].end();
while((*it).second==maxpl[v]||(*it).second==maxpl1[v]){
if(it==s[u].begin()){
break;
}
--it;
}
if((*it).second!=maxpl[v]&&(*it).second!=maxpl1[v]){
ff[v]=(*it).second;
if(s[u].lower_bound({(*it).first,0})==s[u].end()){
continue;
}
if(s[u].lower_bound({(*it).first,0})==s[u].begin()){
continue;
}
auto it1=--s[u].lower_bound({(*it).first,0});
while((*it1).second==maxpl[v]||(*it1).second==maxpl1[v]){
if(it1==s[u].begin()){
break;
}
--it1;
}
if((*it1).second!=maxpl[v]&&(*it).second!=maxpl1[v]){
ff1[v]=(*it1).second;
}
}
}
}
void dfs1(int u){
for(auto v:g[u]){
if(ff[u]&&a[ff[u]].l>a[ff[v]].l){
ff1[v]=ff[v];
ff[v]=ff[u];
}else if(ff[u]&&a[ff[u]].l>a[ff1[v]].l&&a[ff[u]].l<a[ff[v]].l){
ff1[v]=ff[u];
}
if(ff1[u]&&a[ff1[u]].l>a[ff1[v]].l&&a[ff1[u]].l<a[ff[v]].l){
ff1[v]=ff1[u];
}
dfs1(v);
}
}
signed main(){
// freopen("soldier.in","r",stdin);
// freopen("soldier.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>q;
for(int i=2;i<=n;i++){
cin>>fa[i];
g[fa[i]].push_back(i);
}
for(int i=1;i<=n;i++){
cin>>a[i].b>>a[i].l;
}
dfs(1);
dfs1(1);
for(int i=1;i<=q;i++){
int s;
cin>>s;
if(vis[s]&&a[ff[s]].l){
cout<<maxv[s]<<"\n";
continue;
}
if(maxv1[s]){
if(!ff[s]&&!ff1[s]){
cout<<maxv1[s]<<"\n";
continue;
}
if(ff[s]&&!ff1[s]){
if(maxv1[s]+a[ff[s]].l==maxv[s]){
cout<<max(maxv1[s],maxp2[s]>=1?maxv2[s]+a[ff[s]].l:-1)<<"\n";
}else{
if(maxv1[s]+a[ff[s]].l>maxv[s]){
cout<<maxv[s]<<"\n";
}else{
cout<<maxv1[s]+a[ff[s]].l<<"\n";
}
}
continue;
}
if(maxv1[s]+a[ff[s]].l==maxv[s]){
cout<<max(maxv1[s]+a[ff1[s]].l,maxp2[s]>=1?maxv2[s]+a[ff[s]].l:-1)<<"\n";
}else{
if(maxv1[s]+a[ff[s]].l>maxv[s]){
cout<<maxv[s]<<"\n";
}else{
cout<<maxv1[s]+a[ff[s]].l<<"\n";
}
}
}else{
if(sz[s]==1){
cout<<"0\n";
}else{
if(ff[s]){
cout<<maxv[s]<<"\n";
}else{
cout<<maxv1[s]<<"\n";
}
}
}
}
return 0;
}
/*
10 1
1 2 2 2 2 3 3 7 8
1 0
4 7
4 1
7 8
7 8
7 3
5 8
5 4
7 4
3 6
2
*/
*/