func_code_string: #include <bits/stdc++.h>   using namespace std;   vector<long long> v[2000006], pp[2000006];   long long first[2000006], cur = 0, w[2000006], n, m, i, xx, second, d, h, ans,                             w1, p, tt, o, temp, t;   void dfs(long long node, long long l) {     if (node > n) return;     long long i, j;     first[node] = l;     v[node].push_back(l);     dfs(2 * node, l + w[2 * node]);     dfs(2 * node + 1, l + w[2 * node + 1]);     for (j = 0; j < v[2 * node].size(); ++j) v[node].push_back(v[2 * node][j]);     for (j = 0; j < v[2 * node + 1].size(); ++j)       v[node].push_back(v[2 * node + 1][j]);     sort(v[node].begin(), v[node].end());     pp[node].resize(v[node].size());     pp[node][0] = v[node][0];     for (i = 1; i < v[node].size(); ++i)       pp[node][i] = v[node][i] + pp[node][i - 1];   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     cin >> n >> m;     for (i = 2; i <= n; ++i) cin >> w[i];     dfs(1, 0);     for (i = 0; i < m; ++i) {       ans = 0;       cin >> d >> h;       t = upper_bound(v[d].begin(), v[d].end(), h + first[d]) - v[d].begin();       if (t) ans = (h + first[d]) * t - pp[d][t - 1];       while (d != 1) {         w1 = w[d];         p = d / 2;         if (h > w1) ans += h - w1;         o = d - (d % 2) + !(d % 2);         if (o <= n) {           temp = h - (w[o] + w1) + first[o];           tt = upper_bound(v[o].begin(), v[o].end(), temp) - v[o].begin();           if (tt) ans += tt * temp - pp[o][tt - 1];         }         h -= w[d];         d >>= 1;       }       cout << ans <<   n ;     }     return 0;   }   