#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 10, MN = 1e6 + 10;
vector<long long> Ps[MN], vec[MN];
int w[MN], n, q;
void dfs(int s) {
  if (s * 2 <= n) dfs(s << 1);
  if (s * 2 + 1 <= n) dfs(s << 1 | 1);
  vec[s].push_back(0);
  vector<long long> A;
  if (s * 2 <= n) {
    A = vec[s << 1];
    for (auto &x : A) x += w[s << 1];
  }
  vector<long long> B;
  if (s * 2 + 1 <= n) {
    B = vec[s << 1 | 1];
    for (auto &x : B) x += w[s << 1 | 1];
  }
  merge(A.begin(), A.end(), B.begin(), B.end(), back_inserter(vec[s]));
  Ps[s].resize(((int)(vec[s]).size()) + 1);
  Ps[s][0] = 0;
  for (int i = 1; i < ((int)(Ps[s]).size()); ++i)
    Ps[s][i] = Ps[s][i - 1] + vec[s][i - 1];
}
long long get(long long Base, int v, int H, int BH) {
  if (H < 0) return 0;
  int ind = upper_bound(vec[v].begin(), vec[v].end(), H) - vec[v].begin();
  return 1ll * BH * ind - (1ll * Base * ind + Ps[v][ind]);
}
int main() {
  ios_base ::sync_with_stdio(false), cout.tie(0), cin.tie(0);
  cin >> n >> q;
  for (int i = 2; i <= n; ++i) cin >> w[i];
  dfs(1);
  while (q--) {
    int v, H;
    cin >> v >> H;
    int lst = v;
    long long ans = get(0, v, H, H);
    long long passed = w[v];
    v /= 2;
    while (v >= 1 && passed <= H) {
      ans += H - passed;
      if (v * 2 == lst && v * 2 + 1 <= n)
        ans +=
            get(passed + w[v * 2 + 1], v * 2 + 1, H - passed - w[v * 2 + 1], H);
      if (v * 2 + 1 == lst)
        ans += get(passed + w[v * 2], v * 2, H - passed - w[v * 2], H);
      lst = v;
      passed += w[v];
      v /= 2;
    }
    cout << ans << '\n';
  }
  return 0;
}
