#include <bits/stdc++.h>
using namespace std;
vector<long long> v[2000006], pp[2000006];
long long first[2000006], cur = 0, w[2000006], n, m, i, xx, second, d, h, ans,
                          w1, p, tt, o, temp, t;
void dfs(long long node, long long l) {
  if (node > n) return;
  long long i, j;
  first[node] = l;
  v[node].push_back(l);
  dfs(2 * node, l + w[2 * node]);
  dfs(2 * node + 1, l + w[2 * node + 1]);
  for (j = 0; j < v[2 * node].size(); ++j) v[node].push_back(v[2 * node][j]);
  for (j = 0; j < v[2 * node + 1].size(); ++j)
    v[node].push_back(v[2 * node + 1][j]);
  sort(v[node].begin(), v[node].end());
  pp[node].resize(v[node].size());
  pp[node][0] = v[node][0];
  for (i = 1; i < v[node].size(); ++i)
    pp[node][i] = v[node][i] + pp[node][i - 1];
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (i = 2; i <= n; ++i) cin >> w[i];
  dfs(1, 0);
  for (i = 0; i < m; ++i) {
    ans = 0;
    cin >> d >> h;
    t = upper_bound(v[d].begin(), v[d].end(), h + first[d]) - v[d].begin();
    if (t) ans = (h + first[d]) * t - pp[d][t - 1];
    while (d != 1) {
      w1 = w[d];
      p = d / 2;
      if (h > w1) ans += h - w1;
      o = d - (d % 2) + !(d % 2);
      if (o <= n) {
        temp = h - (w[o] + w1) + first[o];
        tt = upper_bound(v[o].begin(), v[o].end(), temp) - v[o].begin();
        if (tt) ans += tt * temp - pp[o][tt - 1];
      }
      h -= w[d];
      d >>= 1;
    }
    cout << ans << "\n";
  }
  return 0;
}
