#include <bits/stdc++.h>
using namespace std;
const long long modn = 1000000007;
inline long long mod(long long x) { return x % modn; }
template <class num>
inline void rd(num &x) {
  char c;
  while (isspace(c = getchar()))
    ;
  bool neg = false;
  if (!isdigit(c))
    neg = (c == '-'), x = 0;
  else
    x = c - '0';
  while (isdigit(c = getchar())) x = (x << 3) + (x << 1) + c - '0';
  if (neg) x = -x;
}
int n;
const int N = 1123456;
vector<long long> query[N];
vector<pair<long long, long long> > ans[N];
int A[N];
long long H[N], l[N];
long long acc[N], tmp[N];
int tn;
void dfs(int u, long long d) {
  if (u > n) return;
  tmp[tn++] = d;
  dfs(2 * u, d + l[2 * u]);
  dfs(2 * u + 1, d + l[2 * u + 1]);
}
void answer_for(int u) {
  tn = 0;
  dfs(u, 0);
  sort(tmp, tmp + tn);
  acc[0] = tmp[0];
  for (int i = 1; i < tn; i++) acc[i] = acc[i - 1] + tmp[i];
  sort(query[u].begin(), query[u].end());
  ans[u].resize(query[u].size());
  for (int i = int(query[u].size()) - 1; i >= 0; i--) {
    while (tn > 0 && tmp[tn - 1] > query[u][i]) tn--;
    ans[u][i] = pair<long long, long long>(tn, tn ? acc[tn - 1] : 0ll);
  }
}
inline void reg(int u, long long v) { query[u].push_back(v); }
inline pair<long long, long long> get(int u, long long v) {
  return ans[u][lower_bound(query[u].begin(), query[u].end(), v) -
                query[u].begin()];
}
int main() {
  int m;
  int i;
  rd(n);
  rd(m);
  for (i = 2; i <= n; i++) rd(l[i]);
  for (i = 0; i < m; i++) {
    rd(A[i]);
    rd(H[i]);
    int ai = A[i];
    long long hi = H[i];
    reg(ai, hi);
    int nx = ai;
    hi -= l[ai];
    ai = ai / 2;
    while (ai && hi > 0) {
      reg(ai, hi);
      if (hi - l[nx] > 0) reg(nx, hi - l[nx]);
      nx = ai;
      hi -= l[ai];
      ai = ai / 2;
    }
  }
  for (int i = 1; i <= n; i++) answer_for(i);
  for (i = 0; i < m; i++) {
    int ai = A[i];
    long long hi = H[i];
    pair<long long, long long> ans = get(ai, hi);
    int nx = ai;
    hi -= l[ai];
    ai = ai / 2;
    while (ai && hi > 0) {
      pair<long long, long long> p = get(ai, hi);
      ans.first += p.first;
      ans.second += p.first * (H[i] - hi) + p.second;
      if (hi - l[nx] > 0) {
        pair<long long, long long> p = get(nx, hi - l[nx]);
        ans.first -= p.first;
        ans.second -= p.first * (H[i] - hi + l[nx]) + p.second;
      }
      nx = ai;
      hi -= l[ai];
      ai = ai / 2;
    }
    printf("%lld\n", ans.first * H[i] - ans.second);
  }
}
