#include <bits/stdc++.h>
long long d[1000100];
int n;
std::vector<long long> dist[1000100];
std::vector<long long> prefsum[1000100];
std::pair<long long, long long> G[1000100];
void copy_vector(int dst, int src) {
  dist[dst].insert(dist[dst].end(), dist[src].begin(), dist[src].end());
}
void build(void) {
  for (int i = n; i > 0; i--) {
    long long s = 0;
    dist[i].push_back(d[i]);
    if (G[i].first) copy_vector(i, 2 * i);
    if (G[i].second) copy_vector(i, 2 * i + 1);
    std::sort(dist[i].begin(), dist[i].end());
    for (auto c : dist[i]) prefsum[i].push_back(s += c);
  }
}
void dfs(int v, long long cur) {
  d[v] = cur;
  if (G[v].first) dfs(2 * v, cur + G[v].first);
  if (G[v].second) dfs(2 * v + 1, cur + G[v].second);
}
long long solve(int src, long long happiness, int lca, bool first) {
  long long dlca = first ? d[lca] : d[lca / 2];
  auto x = std::lower_bound(dist[lca].begin(), dist[lca].end(),
                            happiness - d[src] + 2LL * dlca);
  if (x == dist[lca].begin()) return 0;
  long long idx = std::distance(dist[lca].begin(), x);
  return 1LL * happiness * idx -
         (1LL * idx * d[src] + prefsum[lca][idx - 1] - 2LL * idx * dlca);
}
int main(void) {
  int m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i < n; i++) {
    int x;
    scanf("%d", &x);
    if (G[(i + 1) / 2].first != 0)
      G[(i + 1) / 2].second = x;
    else
      G[(i + 1) / 2].first = x;
  }
  dfs(1, 0);
  build();
  for (int i = 0; i < m; i++) {
    int v;
    long long h;
    long long ans = 0;
    scanf("%d%lld", &v, &h);
    int v0 = v;
    ans += solve(v, h, v, true);
    while (v > 1) {
      if ((v ^ 1) <= n) ans += solve(v0, h, v ^ 1, false);
      v >>= 1;
    }
    v = v0;
    while (v) {
      if (v != v0 && h > d[v0] - d[v]) ans += h - (d[v0] - d[v]);
      v >>= 1;
    }
    printf("%lld\n", ans);
  }
  return 0;
}
