#include <bits/stdc++.h>
using namespace std;
const long long N = 1e6 + 1;
const long long M = 1e5 + 1;
vector<int> len;
vector<int> dist[N];
vector<long long> pre[N];
long long n, m;
void mer(long long v, long long l, long long addl, long long r,
         long long addr) {
  dist[v].push_back(0);
  long long sl = dist[l].size();
  long long sr = dist[r].size();
  long long pl = 0;
  long long pr = 0;
  while (pl < sl && pr < sr) {
    if (dist[l][pl] + addl <= dist[r][pr] + addr) {
      dist[v].push_back(dist[l][pl] + addl);
      pl++;
    } else {
      dist[v].push_back(dist[r][pr] + addr);
      pr++;
    }
  }
  while (pl < sl) {
    dist[v].push_back(dist[l][pl] + addl);
    pl++;
  }
  while (pr < sr) {
    dist[v].push_back(dist[r][pr] + addr);
    pr++;
  }
  return;
}
void bfs(long long v) {
  if (v > n) return;
  long long l = 2 * v;
  long long r = 2 * v + 1;
  bool cl = false, cr = false;
  if (l <= n) {
    bfs(l);
    cl = true;
  }
  if (r <= n) {
    bfs(r);
    cr = true;
  }
  if (cl && cr) {
    long long addl = len[2 * v - 1];
    long long addr = len[2 * v];
    mer(v, l, addl, r, addr);
  } else if (cl && !cr) {
    long long addl = len[2 * v - 1];
    dist[v].push_back(0);
    for (long long x : dist[l]) dist[v].push_back(addl + x);
  } else if (cr && !cl) {
    long long addr = len[2 * v];
    dist[v].push_back(0);
    for (long long x : dist[r]) dist[v].push_back(addr + x);
  } else {
    dist[v].push_back(0);
  }
  long long sze = dist[v].size();
  pre[v].resize(sze);
  long long prev = 0ll;
  for (long long i = 0; i < sze; i++) {
    pre[v][i] = prev + dist[v][i];
    prev = pre[v][i];
  }
  return;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  len.push_back(-1);
  cin >> n >> m;
  for (long long i = 0; i < n - 1; i++) {
    long long x;
    cin >> x;
    len.push_back(x);
  }
  bfs(1);
  for (long long i = 0; i < m; i++) {
    long long ans = 0ll;
    long long a, h;
    cin >> a >> h;
    long long opt = 3;
    while (a >= 1) {
      if (h < 0) break;
      if (opt == 3) {
        long long cnt =
            (upper_bound(dist[a].begin(), dist[a].end(), h) - dist[a].begin());
        if (cnt > 0) ans += (cnt)*h - pre[a][cnt - 1];
      } else if (opt == 2) {
        ans += h;
        if (2 * a <= n) {
          long long cnt = (upper_bound(dist[2 * a].begin(), dist[2 * a].end(),
                                       h - len[2 * a - 1]) -
                           dist[2 * a].begin());
          if (cnt > 0)
            ans += (cnt) * (h - len[2 * a - 1]) - pre[2 * a][cnt - 1];
        }
      } else {
        if (h > 0) ans += h;
        if (2 * a + 1 <= n) {
          long long cnt = (upper_bound(dist[2 * a + 1].begin(),
                                       dist[2 * a + 1].end(), h - len[2 * a]) -
                           dist[2 * a + 1].begin());
          if (cnt > 0)
            ans += (cnt) * (h - len[2 * a]) - pre[2 * a + 1][cnt - 1];
        }
      }
      if (a % 2) {
        h -= len[2 * (a / 2)];
        opt = 2;
      } else {
        h -= len[2 * (a / 2) - 1];
        opt = 1;
      }
      a /= 2;
    }
    cout << ans << endl;
  }
}
