#include<bits/stdc++.h>
using namespace std;
#define int long long
int T;
unordered_map<int,int>p[100005];
vector<int>ep[100005];
int dep[100005];
int n,q;
int a[100005];
int fa[100005];
int s[100005];
void dfs(int k,int sum){
dep[k]=dep[fa[k]]+1;
sum+=a[k]*a[k];
s[k]=sum;
for(int i=0;i<ep[k].size();i++){
dfs(ep[k][i],sum);
}
}
int f(int x,int y){
if(x>y)swap(x,y);
if(x==y)return s[x];
if(dep[x]%3==0){
int op=p[x][y];
if(op)return op;
return p[x][y]=f(fa[x],fa[y])+a[x]*a[y];
}
return f(fa[x],fa[y])+a[x]*a[y];
}
void solve(){
scanf("%lld %lld",&n,&q);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
int t1,t2;
for(int i=2;i<=n;i++){
scanf("%lld",&fa[i]);
ep[fa[i]].push_back(i);
}
dfs(1,0);
for(int i=1;i<=q;i++){
scanf("%lld %lld",&t1,&t2);
printf("%lld\n",f(t1,t2));
}
}
signed main(){
T=1;
//ios::sync_with_stdio(0);
//cin.tie(0);
//cin>>T;
while(T--){
solve();
}
return 0;
}
1519A - Red and Blue Beans | 466A - Cheap Travel |
659E - New Reform | 1385B - Restore the Permutation by Merger |
706A - Beru-taxi | 686A - Free Ice Cream |
1358D - The Best Vacation | 1620B - Triangles on a Rectangle |
999C - Alphabetic Removals | 1634C - OKEA |
1368C - Even Picture | 1505F - Math |
1473A - Replacing Elements | 959A - Mahmoud and Ehab and the even-odd game |
78B - Easter Eggs | 1455B - Jumps |
1225C - p-binary | 1525D - Armchairs |
1257A - Two Rival Students | 1415A - Prison Break |
1271A - Suits | 259B - Little Elephant and Magic Square |
1389A - LCM Problem | 778A - String Game |
1382A - Common Subsequence | 1512D - Corrupted Array |
667B - Coat of Anticubism | 284B - Cows and Poker Game |
1666D - Deletive Editing | 1433D - Districts Connection |