#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
int add(int a, int b) {
  long long x = a + b;
  if (x >= 1000000007) x -= 1000000007;
  if (x < 0) x += 1000000007;
  return x;
}
long long mul(long long a, long long b) { return (a * b) % 1000000007; }
long long pw(long long a, long long b) {
  long long ans = 1;
  while (b) {
    if (b & 1) ans = (ans * a) % 1000000007;
    a = (a * a) % 1000000007;
    b >>= 1;
  }
  return ans;
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
long long rand_seed() {
  long long a = rng();
  return a;
}
int n, q;
vector<pair<int, int> > v[1000002];
int tt[1000002];
int dist[1000002], costdad[1000002];
void dfs(int nod) {
  for (int i = 0; i < v[nod].size(); ++i) {
    int vecin = v[nod][i].first;
    dist[vecin] = dist[nod] + v[nod][i].second;
    dfs(vecin);
  }
}
vector<int> aint[1000002];
vector<long long> sp[1000002];
long long ini, dn;
long long query(int plc, int mxx, int drem) {
  int st = 0;
  int dr = aint[plc].size() - 1;
  int ans = -1;
  while (st <= dr) {
    int mid = (st + dr) / 2;
    if (aint[plc][mid] <= mxx)
      ans = mid, st = mid + 1;
    else
      dr = mid - 1;
  }
  if (ans == -1) return 0;
  return 1LL * (ans + 1) * mxx - sp[plc][ans];
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> q;
  for (int i = 1; i < n; ++i) {
    int a = (i + 1) / 2;
    int b = i + 1;
    int le;
    cin >> le;
    tt[b] = a;
    costdad[b] = le;
    v[a].push_back({b, le});
  }
  dfs(1);
  for (int i = 1; i <= n; ++i) {
    int xx = i;
    while (xx) {
      aint[xx].push_back(dist[i]);
      xx = tt[xx];
    }
  }
  for (int i = 1; i <= n; ++i) {
    sort(aint[i].begin(), aint[i].end());
    for (int j = 0; j < aint[i].size(); ++j) {
      sp[i].push_back(0);
      sp[i][j] = aint[i][j];
      if (j) sp[i][j] += sp[i][j - 1];
    }
  }
  for (int i = 1; i <= q; ++i) {
    int st, di;
    cin >> st >> di;
    ini = di;
    long long drem = di;
    long long ans = query(st, dist[st] + drem, drem);
    while (1) {
      drem -= costdad[st];
      int son = st;
      st = tt[st];
      if (drem < 0 || st == 0) break;
      ans += query(st, drem + dist[st], drem);
      ans -= query(son, drem + dist[st], drem);
    }
    cout << ans << '\n';
  }
  return 0;
}
