#include <bits/stdc++.h>
using namespace std;
int n, m;
const int maxn = 1e6 + 5;
long long l[maxn];
long long a[maxn], h[maxn];
vector<long long> G[maxn];
vector<long long> sum[maxn];
vector<long long> dfs(int u) {
  if (u > n) return vector<long long>(0);
  G[u].push_back(0);
  vector<long long> a = dfs(u * 2);
  vector<long long> b = dfs(u * 2 + 1);
  for (int i = 0; i < a.size(); i++) {
    a[i] += l[2 * u];
  }
  for (int i = 0; i < b.size(); i++) {
    b[i] += l[2 * u + 1];
  }
  int front1 = 0, front2 = 0;
  while (front1 < a.size() && front2 < b.size()) {
    if (a[front1] < b[front2]) {
      G[u].push_back(a[front1]);
      front1++;
    } else {
      G[u].push_back(b[front2]);
      front2++;
    }
  }
  while (front1 < a.size()) {
    G[u].push_back(a[front1]);
    front1++;
  }
  while (front2 < b.size()) {
    G[u].push_back(b[front2]);
    front2++;
  }
  for (int i = 0; i < G[u].size(); i++) {
    if (i == 0)
      sum[u].push_back(G[u][i]);
    else
      sum[u].push_back(G[u][i] + sum[u][i - 1]);
  }
  return G[u];
}
long long solve(int u, long long h) {
  long long id = upper_bound(G[u].begin(), G[u].end(), h) - G[u].begin();
  id--;
  if (id < 0) return 0;
  return 1LL * h * (id + 1) - sum[u][id];
}
int main() {
  cin >> n >> m;
  for (int i = 2; i <= n; i++) {
    scanf("%lld", l + i);
  }
  dfs(1);
  for (int i = 1; i <= m; i++) {
    scanf("%lld%lld", a + i, h + i);
    long long ans = 0;
    ans += solve(a[i], h[i]);
    int last = a[i];
    a[i] /= 2;
    while (a[i] > 0) {
      h[i] -= l[last];
      if (h[i] < 0) break;
      ans += solve(a[i], h[i]);
      ans -= solve(last, h[i] - l[last]);
      last = a[i];
      a[i] /= 2;
    }
    printf("%lld\n", ans);
  }
  return 0;
}
