#include <bits/stdc++.h>
using namespace std;
const long long int N = 1e6 + 10;
long long int mod = 1e9 + 7;
long long int t;
long long int n, m;
long long int x;
vector<long long int> adj[N];
vector<long long int> sb[N];
vector<long long int> prefix_sb[N];
long long int ans;
long long int cnt;
long long int nd, hval;
long long int pv;
void dfs(long long int node) {
  if (node > n) return;
  sb[node].push_back(0);
  if (adj[node].size() > 0) {
    dfs(2 * node);
    for (auto it : sb[2 * node]) sb[node].push_back(adj[node][0] + it);
    if (adj[node].size() > 1) {
      dfs(2 * node + 1);
      for (auto it : sb[2 * node + 1]) sb[node].push_back(adj[node][1] + it);
    }
  }
  sort(sb[node].begin(), sb[node].end());
  prefix_sb[node] = sb[node];
  for (int i = 1; i < sb[node].size(); i++)
    prefix_sb[node][i] += prefix_sb[node][i - 1];
}
void solve() {
  cin >> n >> m;
  for (int i = 1; i < n; i++) {
    cin >> x;
    adj[((i + 1) / 2)].push_back(x);
  }
  dfs(1);
  while (m--) {
    cin >> nd >> hval;
    ans = 0;
    cnt = 0;
    int idx =
        int(lower_bound(sb[nd].begin(), sb[nd].end(), hval) - sb[nd].begin()) -
        1;
    if (idx != -1) {
      cnt += idx + 1;
      ans += prefix_sb[nd][idx];
    }
    pv = nd;
    nd /= 2;
    long long int updist = 0;
    while (nd >= 1 && updist < hval) {
      if (2 * nd == pv) {
        updist += adj[nd][0];
        if (updist >= hval) break;
        if (adj[nd].size() == 2) {
          long long int rc = 2 * nd + 1;
          auto it = int(lower_bound(sb[rc].begin(), sb[rc].end(),
                                    hval - updist - adj[nd][1]) -
                        sb[rc].begin()) -
                    1;
          if (it != -1) {
            cnt += it + 1;
            ans += ((it + 1) * adj[nd][1]);
            ans += prefix_sb[rc][it];
            ans += ((updist) * (it + 1));
          }
        }
      } else {
        updist += adj[nd][1];
        if (updist >= hval) break;
        long long int lc = 2 * nd;
        auto it = int(lower_bound(sb[lc].begin(), sb[lc].end(),
                                  hval - updist - adj[nd][0]) -
                      sb[lc].begin()) -
                  1;
        if (it != -1) {
          cnt += it + 1;
          ans += ((it + 1) * adj[nd][0]);
          ans += prefix_sb[lc][it];
          ans += ((updist) * (it + 1));
        }
      }
      if (updist < hval) {
        cnt++;
        ans += updist;
      } else
        break;
      pv = nd;
      nd /= 2;
    }
    long long int temp = (cnt * hval);
    temp -= ans;
    cout << temp << endl;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
