#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q,l[2000005],depth[2000005];
vector<int> a[2000005],sum[2000005];
void pre(int cur,int s){
if(cur>n)
return;
a[s].push_back(depth[cur]);
pre(cur*2,s);
pre(cur*2+1,s);
}
int help(int x,int val){
if(val<0||x<1||x>n)
return 0;
int lt=-1,rt=a[x].size();
while(lt+1<rt){
int mid=lt+rt>>1;
if(a[x][mid]<val+depth[x])
lt=mid;
else
rt=mid;
}
int s=lt+1;
return s*(val+depth[x])-sum[x][lt];
}
int find(int x,int val){
if(val<0||x==0)
return 0;
if(x!=1){
int cur=max(0ll,val-l[x])+find(x/2,val-l[x]);
if((x^1)<=n)
cur+=help(x^1,val-l[x]-l[x^1]);
return cur;
}
else
return 0;
}
void dfs(int cur,int fa,int w){
if(cur>n)
return;
depth[cur]=depth[fa]+w;
dfs(cur*2,cur,l[cur*2]);
dfs(cur*2+1,cur,l[cur*2+1]);
return;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
for(int i=2; i<=n; i++)
cin>>l[i];
dfs(1,0,0);
for(int i=1; i<=n; i++)
pre(i,i);
for(int i=1; i<=n; i++)
sort(a[i].begin(),a[i].end());
for(int i=1; i<=n; i++){
if(a[i].size())
sum[i].push_back(a[i][0]);
for(int j=1; j<a[i].size(); j++)
sum[i].push_back(sum[i][sum[i].size()-1]+a[i][j]);
}
while(q--){
int x,val;
cin>>x>>val;
int ans=help(x,val);
cout<<ans+find(x,val)<<'\n';
}
return 0;
}