#include <bits/stdc++.h>
using namespace std;
const int N = 3000010;
int n, m;
long long l[N];
vector<long long> v[N];
vector<long long> csum[N];
void process(int x) {
  v[x].push_back(0);
  int nxt = x * 2;
  if (x * 2 <= n && x * 2 + 1 <= n) {
    process(nxt);
    process(nxt + 1);
    int i = 0, j = 0;
    while (i < v[nxt].size() && j < v[nxt + 1].size()) {
      if (v[nxt][i] + l[nxt - 1] <= v[nxt + 1][j] + l[nxt])
        v[x].push_back(v[nxt][i++] + l[nxt - 1]);
      else
        v[x].push_back(v[nxt + 1][j++] + l[nxt]);
    }
    while (i < v[nxt].size()) v[x].push_back(v[nxt][i++] + l[nxt - 1]);
    while (j < v[nxt + 1].size()) v[x].push_back(v[nxt + 1][j++] + l[nxt]);
  } else if (x * 2 <= n) {
    process(nxt);
    int i = 0;
    while (i < v[nxt].size()) v[x].push_back(v[nxt][i++] + l[nxt - 1]);
  }
}
inline long long getSum(int x, long long h) {
  if (h <= 0) return 0;
  if (x > n) return 0;
  int idx = lower_bound(v[x].begin(), v[x].end(), h + 1) - v[x].begin();
  return (h * idx) - csum[x][idx];
}
inline long long solve(int x, long long h, int lst = -1) {
  if (h <= 0) return 0;
  long long ans = 0;
  if (lst == -1)
    ans = getSum(x, h);
  else {
    if (x * 2 == lst)
      ans += getSum(x * 2 + 1, h - l[x * 2]);
    else
      ans += getSum(x * 2, h - l[x * 2 - 1]);
  }
  if (x > 1 && h - l[x - 1] >= 0)
    ans += solve(x / 2, h - l[x - 1], x) + (h - l[x - 1]);
  return ans;
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i < n; ++i) scanf("%lld", l + i);
  process(1);
  for (int i = 1; i <= n; ++i) {
    csum[i].push_back(0);
    for (int j = 0; j < v[i].size(); ++j)
      csum[i].push_back(v[i][j] + csum[i][j]);
  }
  while (m--) {
    int a, h;
    scanf("%d %d", &a, &h);
    printf("%lld\n", solve(a, h));
  }
  return 0;
}
