#include <bits/stdc++.h>
using namespace std;
int n, m;
int p[1000005];
vector<pair<int, int> > g[1000005];
vector<long long> q[1000005], sum[1000005];
void dfs(int v) {
  q[v].push_back(0);
  for (int i = 0; i < (int)g[v].size(); ++i) {
    int to = g[v][i].first;
    int dop = g[v][i].second;
    dfs(to);
    for (int j = 0; j < (int)q[to].size(); ++j) q[v].push_back(q[to][j] + dop);
  }
  sort(q[v].begin(), q[v].end());
  sum[v].push_back(q[v][0]);
  for (int j = 1; j < (int)q[v].size(); ++j)
    sum[v].push_back(sum[v][j - 1] + q[v][j]);
}
long long bin_p(int v, long long was, int b) {
  long long ans = 0;
  int l = 0, r = (int)q[v].size() - 1;
  while (r - l > 1) {
    int mid = (l + r) / 2;
    if (q[v][mid] + was < b)
      l = mid;
    else
      r = mid;
  }
  if (q[v][l] + was < b) ans = (l + 1) * (b - was) - sum[v][l];
  if (q[v][r] + was < b && r > l) ans += b - q[v][r] - was;
  return ans;
}
long long get(int v, int x, long long dop, int var) {
  if (dop >= x) return 0;
  long long ans = 0;
  if (var) ans = bin_p(v * 2, dop + p[v * 2], x);
  if (!var && (int)q[v * 2 + 1].size())
    ans = bin_p(v * 2 + 1, dop + p[v * 2 + 1], x);
  return ans + (v > 1 ? get(v / 2, x, dop + p[v], v % 2) : 0) + (x - dop);
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i < n; ++i) {
    int x;
    scanf("%d", &x);
    g[(i + 1) / 2].push_back(make_pair(i + 1, x));
    p[i + 1] = x;
  }
  dfs(1);
  for (int i = 0; i < m; ++i) {
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%lld\n", (a > 1 ? get(a / 2, b, p[a], a % 2) : 0) + bin_p(a, 0, b));
  }
  return 0;
}
