#include <bits/stdc++.h>
using namespace std;
template <class T>
void addmod(T &a, long long b) {
  a = (a + b) % 1000000007;
}
template <class T>
void mulmod(T &a, long long b) {
  a = (a * b) % 1000000007;
}
template <class T>
bool domin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
template <class T>
bool domax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
int gi() {
  int a;
  scanf("%d", &a);
  return a;
}
long long gll() {
  long long a;
  scanf("%lld", &a);
  return a;
}
vector<long long> lengths[1000007], prsum[1000007];
int sz[1000007];
class graphal {
 public:
  int n;
  graphal(const int &n) : n(n) {}
  void load() {
    for (int i = 2; i <= n; i++) sz[i] = gi();
  }
  void dfs(int v = 1) {
    if (v > n) return;
    dfs(v * 2);
    dfs(v * 2 + 1);
    if (lengths[v].size() > 0) {
      sort(lengths[v].begin(), lengths[v].end());
      prsum[v].resize(lengths[v].size());
      for (size_t i = 0; i < lengths[v].size(); i++) {
        prsum[v][i] = lengths[v][i];
        if (i) prsum[v][i] += prsum[v][i - 1];
      }
    }
    if (v > 1) {
      for (auto i : lengths[v]) {
        lengths[v / 2].push_back(i + sz[v]);
      }
      lengths[v / 2].push_back(sz[v]);
    }
  }
  long long calc(int v, long long rl) {
    if (v > n) return 0;
    if (rl < 0) return 0;
    long long result = rl;
    auto it = upper_bound(lengths[v].begin(), lengths[v].end(), rl);
    if (it == lengths[v].begin()) return result;
    it--;
    int tl = it - lengths[v].begin();
    result += (rl * (tl + 1)) - prsum[v][tl];
    return result;
  }
};
int main() {
  int n = gi(), m = gi();
  graphal g(n);
  g.load();
  g.dfs();
  for (int i = 0; i < m; i++) {
    int v = gi(), rl = gi();
    int cv = -1;
    long long ans = g.calc(v, rl);
    cv = v;
    rl -= sz[v];
    v = v / 2;
    while (v >= 1 && rl >= 0) {
      ans += rl;
      int ov = cv ^ 1;
      ans += g.calc(ov, rl - sz[ov]);
      cv = v;
      rl -= sz[v];
      v = v / 2;
    }
    cout << ans << endl;
  }
  return 0;
}
