#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e6 + 5;
struct nod {
  vector<long long> A;
  vector<long long> S;
  nod() {
    A.push_back(0);
    S.push_back(0);
  }
} dp[MAX][2];
int n, m;
long long ar[MAX];
bool mk[MAX];
void build(int node) {
  if (node > n) return;
  build(node * 2);
  build(node * 2 + 1);
  if ((node << 1) > n) return;
  int sz1 = dp[(node << 1)][0].A.size();
  int sz2 = dp[(node << 1)][1].A.size();
  for (int i = 0; i < max(sz1, sz2); i++) {
    if (i < sz1)
      dp[node][0].A.push_back(dp[(node << 1)][0].A[i] + ar[(node << 1) - 1]);
    if (i < sz2 && i)
      dp[node][0].A.push_back(dp[(node << 1)][1].A[i] + ar[(node << 1) - 1]);
  }
  sort(dp[node][0].A.begin(), dp[node][0].A.end());
  for (int i = 1; i < dp[node][0].A.size(); i++)
    dp[node][0].S.push_back(dp[node][0].A[i] + dp[node][0].S[i - 1]);
  if ((node << 1) + 1 > n) {
    return;
  }
  sz1 = dp[(node << 1) + 1][0].A.size();
  sz2 = dp[(node << 1) + 1][1].A.size();
  for (int i = 0; i < max(sz1, sz2); i++) {
    if (i < sz1)
      dp[node][1].A.push_back(dp[(node << 1) + 1][0].A[i] + ar[(node << 1)]);
    if (i < sz2 && i)
      dp[node][1].A.push_back(dp[(node << 1) + 1][1].A[i] + ar[(node << 1)]);
  }
  sort(dp[node][1].A.begin(), dp[node][1].A.end());
  for (int i = 1; i < dp[node][1].A.size(); i++)
    dp[node][1].S.push_back(dp[node][1].A[i] + dp[node][1].S[i - 1]);
}
long long ans = 0;
int x;
long long h;
void query(int node, int st, long long p) {
  if (!node || p >= h) return;
  ans += h - p;
  int cut = upper_bound(dp[node][!st].A.begin(), dp[node][!st].A.end(), h - p) -
            dp[node][!st].A.begin();
  cut--;
  ans += (h * (cut)) - ((p * cut) + dp[node][!st].S[cut]);
  query(node >> 1, node & 1, p + ar[node - 1]);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  for (int i = 1; i < n; i++) cin >> ar[i];
  build(1);
  while (m--) {
    cin >> x >> h;
    int cut;
    cut = upper_bound(dp[x][0].A.begin(), dp[x][0].A.end(), h) -
          dp[x][0].A.begin();
    cut--;
    ans = (h * (cut + 1)) - dp[x][0].S[cut];
    cut = upper_bound(dp[x][1].A.begin(), dp[x][1].A.end(), h) -
          dp[x][1].A.begin();
    cut--;
    ans += (h * (cut + 1)) - dp[x][1].S[cut];
    ans -= h;
    query(x >> 1, x & 1, ar[x - 1]);
    cout << ans << "\n";
  }
}
