#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
int N, M;
int L[maxn];
struct Node {
  vector<long long> v;
  vector<long long> presum;
  int ld, rd, md;
  Node() {
    v.clear();
    presum.clear();
    ld = rd = md = -1;
  }
} node[maxn];
void build(int now, int prev) {
  node[now] = Node();
  Node *tp = &node[now];
  tp->md = prev;
  tp->v.push_back(0);
  if (now * 2 <= N) {
    tp->ld = L[now * 2];
    build(now * 2, tp->ld);
    for (auto x : node[now * 2].v)
      tp->v.push_back((long long)x + (long long)tp->ld);
  }
  if (now * 2 + 1 <= N) {
    tp->rd = L[now * 2 + 1];
    build(now * 2 + 1, tp->rd);
    for (auto x : node[now * 2 + 1].v)
      tp->v.push_back((long long)x + (long long)tp->rd);
  }
  sort(tp->v.begin(), tp->v.end());
  long long cnt = 0;
  tp->presum.push_back(0);
  for (auto x : tp->v) {
    cnt += x;
    tp->presum.push_back(cnt);
  }
}
long long query(int A, int H, int prev) {
  if (H <= 0) return 0;
  long long ret = H;
  if (A * 2 != prev && A * 2 <= N) {
    Node *tp = &node[A * 2];
    if (H > node[A].ld) {
      int k = (lower_bound(tp->v.begin(), tp->v.end(), H - node[A].ld) -
               tp->v.begin());
      ret += ((long long)(H - node[A].ld) * (long long)(k)-tp->presum[k]);
    }
  }
  if (A * 2 + 1 != prev && A * 2 + 1 <= N) {
    Node *tp = &node[A * 2 + 1];
    if (H > node[A].rd) {
      int k = (lower_bound(tp->v.begin(), tp->v.end(), H - node[A].rd) -
               tp->v.begin());
      ret += ((long long)(H - node[A].rd) * (long long)(k)-tp->presum[k]);
    }
  }
  if (A / 2 > 0) ret += query(A / 2, H - node[A].md, A);
  return ret;
}
int main() {
  scanf("%d%d", &N, &M);
  for (int i = 2; i <= N; i++) scanf("%d", &L[i]);
  build(1, -1);
  while (M--) {
    int A, H;
    scanf("%d%d", &A, &H);
    printf("%lld\n", query(A, H, -1));
  }
}
