#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
vector<pair<int, int> > v[N];
vector<int> Values[N][2];
vector<long long> pre[N][2];
vector<int>::iterator it;
int n, m, L[N];
pair<int, int> par[N];
void DFS(int x, int p) {
  par[x].first = p;
  for (auto j : v[x]) {
    if (j.first != p) {
      par[j.first].second = j.second;
      DFS(j.first, x);
      if (j.first % 2 == 0) {
        for (auto i : Values[j.first][0]) Values[x][0].push_back(i + j.second);
        for (auto i : Values[j.first][1]) Values[x][0].push_back(i + j.second);
        Values[x][0].push_back(j.second);
      } else {
        for (auto i : Values[j.first][0]) Values[x][1].push_back(i + j.second);
        for (auto i : Values[j.first][1]) Values[x][1].push_back(i + j.second);
        Values[x][1].push_back(j.second);
      }
    }
  }
}
long long Solve(int Node, long long dis) {
  long long Ans = 0, sum = 0;
  it = upper_bound(Values[Node][0].begin(), Values[Node][0].end(), dis);
  it--;
  long long idx = it - Values[Node][0].begin();
  idx++;
  if (idx) Ans += (long long)((idx * dis) - pre[Node][0][idx - 1]);
  it = upper_bound(Values[Node][1].begin(), Values[Node][1].end(), dis);
  it--;
  idx = it - Values[Node][1].begin();
  idx++;
  if (idx) Ans += (long long)((idx * dis) - pre[Node][1][idx - 1]);
  long long Dis = dis;
  while (par[Node].first != -1) {
    long long cnt = 1;
    bool Left = true;
    if (Node % 2 != 0) Left = false;
    sum += par[Node].second;
    dis -= par[Node].second;
    Node = par[Node].first;
    Ans += max((long long)0, (cnt * Dis) - sum);
    if (!Left) {
      it = upper_bound(Values[Node][0].begin(), Values[Node][0].end(), dis);
      it--;
      long long idx = it - Values[Node][0].begin();
      idx++;
      if (idx) Ans += max((long long)0, (idx * dis) - pre[Node][0][idx - 1]);
    } else {
      it = upper_bound(Values[Node][1].begin(), Values[Node][1].end(), dis);
      it--;
      long long idx = it - Values[Node][1].begin();
      idx++;
      if (idx) Ans += max((long long)0, (idx * dis) - pre[Node][1][idx - 1]);
    }
    cnt++;
  }
  return Ans;
}
int main() {
  cin >> n >> m;
  for (int i = 1; i < n; i++) scanf("%d", &L[i]);
  for (int i = 1; i < n; i++) {
    int x = (i + 1) / 2;
    int y = i + 1;
    v[x].push_back({y, L[i]});
    v[y].push_back({x, L[i]});
  }
  DFS(1, -1);
  for (int i = 1; i <= n; i++) {
    sort(Values[i][0].begin(), Values[i][0].end());
    sort(Values[i][1].begin(), Values[i][1].end());
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < Values[i][0].size(); j++)
      pre[i][0].push_back((long long)Values[i][0][j] +
                          (j >= 1 ? pre[i][0][j - 1] : 0));
    for (int j = 0; j < Values[i][1].size(); j++)
      pre[i][1].push_back((long long)Values[i][1][j] +
                          (j >= 1 ? pre[i][1][j - 1] : 0));
  }
  while (m--) {
    int A, H;
    scanf("%d%d", &A, &H);
    printf("%I64d\n", Solve(A, H) + H);
  }
  return 0;
}
