#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
int n, m, c, L, q, h, v, u, tmp, tmpH;
vector<pair<int, int> > e[N], sorted[N];
vector<int> costOnly[N];
vector<long long> cumulative[N];
pair<int, int> a[N], b[N];
long long ans;
void dfs(int u) {
  for (int i = 0; i < (int)e[u].size(); ++i) {
    int v = e[u][i].first;
    dfs(v);
  }
  if ((int)e[u].size() == 1) {
    int v = e[u][0].first;
    int c = e[u][0].second;
    sorted[u].push_back(make_pair(v, c));
  } else if (e[u].size() == 2) {
    int I = 0, J = 0;
    int v1 = e[u][0].first, c1 = e[u][0].second;
    int v2 = e[u][1].first, c2 = e[u][1].second;
    a[I++] = make_pair(v1, c1);
    b[J++] = make_pair(v2, c2);
    for (int i = 0; i < (int)sorted[v1].size(); ++i)
      a[I++] = make_pair(sorted[v1][i].first, sorted[v1][i].second + c1);
    for (int j = 0; j < (int)sorted[v2].size(); ++j)
      b[J++] = make_pair(sorted[v2][j].first, sorted[v2][j].second + c2);
    int i = 0, j = 0;
    while (i < I && j < J) {
      if (a[i].second < b[j].second)
        sorted[u].push_back(a[i++]);
      else
        sorted[u].push_back(b[j++]);
    }
    while (i < I) sorted[u].push_back(a[i++]);
    while (j < J) sorted[u].push_back(b[j++]);
  }
}
int main(int argc, char **argv) {
  scanf("%d%d", &n, &m);
  for (int i = 1; i < n; ++i) {
    scanf("%d", &c);
    e[(i + 1) / 2].push_back(make_pair(i + 1, c));
  }
  dfs(1);
  for (int i = 1; i <= n; ++i) {
    for (int j = 0; j < (int)sorted[i].size(); ++j) {
      costOnly[i].push_back(sorted[i][j].second);
      cumulative[i].push_back(sorted[i][j].second);
    }
  }
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j < (int)cumulative[i].size(); ++j)
      cumulative[i][j] += cumulative[i][j - 1];
  }
  while (m--) {
    scanf("%d%d", &v, &h);
    int idx = upper_bound(costOnly[v].begin(), costOnly[v].end(), h) -
              costOnly[v].begin();
    --idx;
    ans = h;
    if (idx >= 0) {
      ans += (long long)h * (idx + 1);
      ans -= cumulative[v][idx];
    }
    if (v & 1)
      L = 0, tmp = v - 1;
    else
      L = 1, tmp = v + 1;
    v >>= 1;
    while (v) {
      if (L)
        h -= e[v][0].second;
      else
        h -= e[v][1].second;
      if (h < 0) break;
      ans += h;
      if (tmp <= n) {
        if (tmp & 1)
          tmpH = h - e[v][1].second;
        else
          tmpH = h - e[v][0].second;
        if (tmpH > 0) {
          ans += tmpH;
          idx = upper_bound(costOnly[tmp].begin(), costOnly[tmp].end(), tmpH) -
                costOnly[tmp].begin();
          --idx;
          if (idx >= 0) {
            ans += (long long)tmpH * (idx + 1);
            ans -= cumulative[tmp][idx];
          }
        }
      }
      if (v & 1)
        L = 0, tmp = v - 1;
      else
        L = 1, tmp = v + 1;
      v >>= 1;
    }
    printf("%lld\n", ans);
  }
  return 0;
}
