#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 10;
int n, m, A[maxn], H[maxn], cnt[maxn];
vector<pair<int, int> > G[maxn], link[maxn];
vector<pair<long long, long long> > path[maxn];
long long sum[maxn], L[maxn];
void toRoot(int u, int t, int idx, int pre) {
  if (t > H[idx] || !u) return;
  cnt[idx]++, sum[idx] += t;
  for (int i = 0; i < G[u].size(); i++) {
    pair<int, int> p = G[u][i];
    if (p.first != pre && t + p.second <= H[idx])
      link[p.first].emplace_back(t + p.second, idx);
  }
  toRoot(u / 2, t + L[u], idx, u);
}
void dfs(int u) {
  for (int i = 0; i < G[u].size(); i++) dfs(G[u][i].first);
  path[u].emplace_back(0, 0);
  int lc = 2 * u, rc = 2 * u + 1;
  long long distl = L[lc], distr = L[rc];
  int i = 0, j = 0;
  while (i < path[lc].size() || j < path[rc].size()) {
    if (i < path[lc].size() &&
        (j >= path[rc].size() ||
         path[lc][i].first + distl < path[rc][j].first + distr)) {
      path[u].emplace_back(path[lc][i].first + distl,
                           path[u].back().second + path[lc][i].first + distl);
      i++;
    } else {
      path[u].emplace_back(path[rc][j].first + distr,
                           path[u].back().second + path[rc][j].first + distr);
      j++;
    }
  }
  for (int i = 0; i < link[u].size(); i++) {
    auto p = link[u][i];
    int lft = H[p.second] - p.first;
    int ind = lower_bound(path[u].begin(), path[u].end(),
                          make_pair((long long)lft + 1, (long long)0)) -
              path[u].begin();
    cnt[p.second] += ind,
        sum[p.second] += (long long)ind * p.first + path[u][ind - 1].second;
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 2; i <= n; i++) {
    scanf("%lld", &L[i]);
    G[i / 2].emplace_back(i, L[i]);
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &A[i], &H[i]);
    toRoot(A[i], 0, i, -1);
  }
  dfs(1);
  for (int i = 1; i <= m; i++)
    printf("%lld\n", (long long)H[i] * cnt[i] - sum[i]);
  return 0;
}
