#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e17;
long long n, m, l[1000005], a, dis[1000005];
long long h;
vector<pair<long long, long long> > v[1000005], emp;
vector<pair<long long, long long> > merge(long long w,
                                          vector<pair<long long, long long> > a,
                                          vector<pair<long long, long long> > b,
                                          long long dist) {
  vector<pair<long long, long long> > res;
  res.clear();
  res.push_back(pair<long long, long long>(dist, dist));
  auto i = a.begin(), j = b.begin();
  while (i != a.end() and j != b.end()) {
    if (i->first <= j->first) {
      res.push_back(
          pair<long long, long long>(i->first, res.back().second + i->first));
      i++;
    } else {
      res.push_back(
          pair<long long, long long>(j->first, res.back().second + j->first));
      j++;
    }
  }
  for (; i != a.end(); i++)
    res.push_back(
        pair<long long, long long>(i->first, res.back().second + i->first));
  for (; j != b.end(); j++)
    res.push_back(
        pair<long long, long long>(j->first, res.back().second + j->first));
  return res;
}
void dfs(long long x, long long dist) {
  dis[x] = dist;
  if (2 * x <= n) dfs(2 * x, dist + l[2 * x]);
  if (2 * x + 1 <= n) dfs(2 * x + 1, dist + l[2 * x + 1]);
  v[x] = merge(x, (2 * x <= n ? v[2 * x] : emp),
               (2 * x + 1 <= n ? v[2 * x + 1] : emp), dist);
}
pair<long long, long long> query(long long x, long long val) {
  auto it = upper_bound(v[x].begin(), v[x].end(),
                        pair<long long, long long>(val, INF));
  if (it == v[x].begin())
    return pair<long long, long long>(0, 0);
  else {
    it--;
    return pair<long long, long long>(it->second, it - v[x].begin() + 1);
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (long long i = (long long)2; i <= (long long)n; i++) cin >> l[i];
  dfs(1, 0);
  while (m--) {
    cin >> a >> h;
    long long ans = 0, num = 0, x = a;
    pair<long long, long long> res = query(x, h + dis[x]);
    ans += res.first - dis[x] * res.second;
    num += res.second;
    if (x % 2 == 0)
      x++;
    else
      x--;
    while (x >= 1) {
      if (x <= n) {
        pair<long long, long long> res = query(x, h - dis[a] + 2 * dis[x / 2]);
        ans += res.first + (dis[a] - 2 * dis[x / 2]) * res.second;
        num += res.second;
      }
      x /= 2;
      if (x >= 1 and x <= n) {
        if (dis[a] - dis[x] <= h) {
          ans += dis[a] - dis[x];
          num++;
        }
      }
      if (x % 2 == 0)
        x++;
      else
        x--;
    }
    cout << num * h - ans << "\n";
  }
}
