#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 10;
int N, M;
long long L[MAXN];
vector<long long> dists[MAXN];
vector<long long> psums[MAXN];
void read_input() {
  scanf("%d %d", &N, &M);
  for (int i = 2; i <= N; i++) {
    scanf("%lld", &L[i]);
  }
}
void store_dists() {
  for (int i = 1; i <= N; i++) {
    dists[i].push_back(0);
  }
  for (int i = N / 2; i >= 1; i--) {
    vector<long long> lc, rc;
    if (2 * i <= N) {
      lc = dists[2 * i];
    }
    if (2 * i + 1 <= N) {
      rc = dists[2 * i + 1];
    }
    for (long long &x : lc) {
      x += L[2 * i];
    }
    for (long long &x : rc) {
      x += L[2 * i + 1];
    }
    merge((lc).begin(), (lc).end(), (rc).begin(), (rc).end(),
          back_inserter(dists[i]));
  }
  for (int i = 1; i <= N; i++) {
    long long p = 0;
    for (long long x : dists[i]) {
      p += x;
      psums[i].push_back(p);
    }
  }
}
int A;
long long H;
pair<int, long long> getbound(int x, long long val) {
  int ind =
      upper_bound((dists[x]).begin(), (dists[x]).end(), val) - dists[x].begin();
  if (ind == 0) {
    return make_pair(0, 0ll);
  }
  return make_pair(ind, psums[x][ind - 1]);
}
long long query() {
  scanf("%d %lld", &A, &H);
  pair<int, long long> ans = getbound(A, H);
  long long distup = 0;
  for (int vert = A / 2, child = A; vert > 0; child = vert, vert /= 2) {
    distup += L[child];
    if (distup > H) {
      break;
    }
    ans.first++;
    ans.second += distup;
    int othchild = child ^ 1;
    long long totdist = distup + L[othchild];
    pair<int, long long> boundoth = getbound(othchild, H - totdist);
    ans.first += boundoth.first;
    ans.second += boundoth.second + totdist * boundoth.first;
  }
  return H * ans.first - ans.second;
}
int main() {
  read_input();
  store_dists();
  for (int qi = 1; qi <= M; qi++) {
    printf("%lld\n", query());
  }
}
