#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > dists(1000005);
vector<vector<unsigned long long> > distsPrefSum(1000005);
int n, m;
int l[1000005];
int getLeftSon(int x) { return 2 * x + 1; }
int getRightSon(int x) { return 2 * x + 2; }
void merg(vector<int> &ans, vector<int> &v1, vector<int> &v2) {
  int ptr1 = 0, ptr2 = 0;
  while (ptr1 < v1.size() || ptr2 < v2.size()) {
    if (ptr2 == v2.size() || (ptr1 != v1.size() && v1[ptr1] < v2[ptr2])) {
      ans.push_back(v1[ptr1++]);
    } else
      ans.push_back(v2[ptr2++]);
  }
}
vector<int> add(vector<int> x, int y) {
  for (int i = 0; i < x.size(); i++) x[i] += y;
  return x;
}
void getPrefSums() {
  for (int i = 0; i < n; i++) {
    distsPrefSum[i].push_back(dists[i][0]);
    for (int j = 1; j < dists[i].size(); j++) {
      distsPrefSum[i].push_back(distsPrefSum[i].back() + dists[i][j]);
    }
  }
}
void preprocess() {
  for (int i = n - 1; i >= 0; i--) {
    dists[i].push_back(0);
    vector<int> leftSonDist, rightSonDist;
    if (getLeftSon(i) < n)
      leftSonDist = add(dists[getLeftSon(i)], l[getLeftSon(i)]);
    if (getRightSon(i) < n)
      rightSonDist = add(dists[getRightSon(i)], l[getRightSon(i)]);
    merg(dists[i], leftSonDist, rightSonDist);
  }
  getPrefSums();
}
int getParent(int x) { return (x - 1) / 2; }
unsigned long long getSum(int idx, int H) {
  int dst =
      lower_bound(dists[idx].begin(), dists[idx].end(), H) - dists[idx].begin();
  if (dst == 0) return 0;
  return (unsigned long long)dst * H - distsPrefSum[idx][dst - 1];
}
unsigned long long query(int x, int h) {
  unsigned long long ans = 0;
  int curDist = 0;
  bool leftChild = 0, rightChild = 0, first = true;
  while (1) {
    if (first) {
      ans += getSum(x, h - curDist);
    } else {
      ans += max(0, h - curDist);
      if (leftChild) {
        ans += getSum(getRightSon(x), h - curDist - l[getRightSon(x)]);
      } else {
        ans += getSum(getLeftSon(x), h - curDist - l[getLeftSon(x)]);
      }
    }
    leftChild = 0, rightChild = 0;
    curDist += l[x];
    if (getParent(x) == x) break;
    if (getLeftSon(getParent(x)) == x) {
      leftChild = true;
    } else {
      rightChild = true;
    }
    first = false;
    x = getParent(x);
  }
  return ans;
}
void input() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n - 1; i++) scanf("%d", &l[i + 1]);
}
int main() {
  input();
  preprocess();
  for (int i = 0; i < m; i++) {
    int a, h;
    scanf("%d %d", &a, &h);
    a--;
    printf("%lld\n", query(a, h));
  }
}
