#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e18;
const long double pi = 3.141592653589793238;
const long long MOD = 1000000007;
const long long N = 1e6 + 10;
long long n, m;
vector<pair<long long, long long>> graph[N];
vector<long long> vertexes[N];
long long par[N];
vector<long long> pre[N];
void merge(long long u, long long v, long long w) {
  vector<long long> ans;
  long long i = 0, j = 0;
  while (i < (long long)vertexes[u].size() &&
         j < (long long)vertexes[v].size()) {
    if (vertexes[u][i] < vertexes[v][j] + w)
      ans.push_back(vertexes[u][i++]);
    else
      ans.push_back(vertexes[v][j++] + w);
  }
  while (i < (long long)vertexes[u].size()) ans.push_back(vertexes[u][i++]);
  while (j < (long long)vertexes[v].size()) ans.push_back(vertexes[v][j++] + w);
  vertexes[u] = ans;
}
void dfs(long long u, long long p) {
  par[u] = p;
  vertexes[u].push_back(0);
  for (auto it : graph[u]) {
    long long v = it.first, w = it.second;
    if (v == p) continue;
    dfs(v, u);
    merge(u, v, w);
  }
  long long sz = vertexes[u].size();
  if (sz == 0) return;
  pre[u].resize(sz);
  pre[u][0] = vertexes[u][0];
  for (long long i = 1; i < sz; i++) pre[u][i] = pre[u][i - 1] + vertexes[u][i];
}
long long calc(long long u, long long x) {
  if (x <= 0) return 0;
  long long idx = upper_bound(vertexes[u].begin(), vertexes[u].end(), x) -
                  vertexes[u].begin();
  long long sz = vertexes[u].size();
  if (sz == 0 || idx == 0) return 0;
  long long sum = x * (idx)-pre[u][idx - 1];
  return sum;
}
void solve() {
  cin >> n >> m;
  map<pair<long long, long long>, long long> mp;
  for (long long i = 1; i <= n - 1; i++) {
    long long l;
    cin >> l;
    mp[make_pair((i + 1) / 2, i + 1)] = l;
    graph[(i + 1) / 2].push_back({i + 1, l});
  }
  dfs(1, -1);
  for (long long i = 1; i <= m; i++) {
    long long a, h;
    cin >> a >> h;
    long long u = a;
    long long cur = 0, dist = 0;
    cur += calc(u, h);
    while (u != -1 && h >= dist) {
      dist += mp[make_pair(par[u], u)];
      if (par[u] != -1) {
        for (auto it : graph[par[u]]) {
          long long v = it.first, w = it.second;
          if (v != u) {
            cur += calc(v, h - dist - w);
          }
        }
        cur += max(0LL, h - dist);
      }
      u = par[u];
    }
    cout << cur << '\n';
  }
}
signed main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  long long t = 1;
  while (t--) {
    solve();
  }
}
