#include <bits/stdc++.h>
using namespace std;
const int M = 1e6 + 10;
long long int n, m, cnt, len[M];
vector<long long int> c[M], dp[M];
void build(long long int v) {
  if (v * 2 > n) {
    dp[v].resize(1);
    c[v].push_back(0);
    return;
  }
  long long int l = 2 * v, r = 2 * v + 1, p = 0, q = 0;
  build(l);
  if (r <= n) build(r);
  c[v].push_back(0);
  while (p < c[l].size() && q < c[r].size())
    if (c[l][p] + len[l] < c[r][q] + len[r])
      c[v].push_back(c[l][p++] + len[l]);
    else
      c[v].push_back(c[r][q++] + len[r]);
  while (p < c[l].size()) c[v].push_back(c[l][p++] + len[l]);
  while (q < c[r].size()) c[v].push_back(c[r][q++] + len[r]);
  dp[v].resize(c[v].size());
  for (long long int i = 1; i < c[v].size(); i++)
    dp[v][i] = c[v][i] + dp[v][i - 1];
}
long long int bs(long long int u, long long int h, long long int dis) {
  long long int d = h - dis, l = 0, r = c[u].size(), mid;
  if (d < 0) return 0;
  while (r - l > 1) {
    mid = (l + r) / 2;
    if (c[u][mid] < d)
      l = mid;
    else
      r = mid;
  }
  cnt += l + 1ll;
  return dp[u][l] + dis * (l + 1);
}
long long int query(long long int u, long long int h) {
  cnt = 0;
  long long int ret = bs(u, h, 0), now = 0;
  while (u > 1) {
    if (((u % 2) ? (u - 1) : (u + 1)) <= n)
      ret += bs(((u % 2) ? (u - 1) : (u + 1)), h,
                now + len[((u % 2) ? (u - 1) : (u + 1))] + len[u]);
    now += len[u];
    if (now < h) cnt++, ret += now;
    u >>= 1;
  }
  return h * cnt - ret;
}
int main() {
  cin >> n >> m;
  for (long long int i = 2; i <= n; i++) scanf("%lld", len + i);
  build(1);
  while (m--) {
    long long int v, h;
    scanf("%lld%lld", &v, &h);
    printf("%lld\n", query(v, h));
  }
  return 0;
}
