func_code_string: #include <bits/stdc++.h>   using namespace std;   const int Z = (int)2e6 + 111;   const int inf = (int)1e9 + 111;   const long long llinf = (long long)1e18 + 5;   const int MOD = (int)1e9 + 7;   vector<pair<int, int> > g[Z];   vector<long long> d[Z], pref[Z];   long long f[Z];   void dfs(int v) {     for (auto to : g[v]) {       dfs(to.first);     }     vector<long long> v1, v2;     int f = 0;     for (auto to : g[v]) {       f++;       for (int i = 0; i < (int)d[to.first].size(); ++i) {         if (f % 2) v1.push_back(d[to.first][i] + to.second);         if (f % 2 == 0) v2.push_back(d[to.first][i] + to.second);       }     }     merge((v1).begin(), (v1).end(), (v2).begin(), (v2).end(),           back_inserter(d[v]));     d[v].resize((int)d[v].size() + 1);     for (int i = (int)d[v].size() - 1; i >= 1; --i) {       d[v][i] = d[v][i - 1];     }     d[v][0] = 0;   }   int main() {     srand(time(0));     int n, m;     scanf( %d%d , &n, &m);     for (int i = 1; i < n; ++i) {       int w;       scanf( %d , &w);       g[(i + 1) / 2].push_back(make_pair(i + 1, w));       f[i + 1] = w;     }     dfs(1);     for (int i = 1; i <= n; ++i) {       pref[i].resize((int)d[i].size());       pref[i][0] = d[i][0];       for (int j = 1; j < (int)d[i].size(); ++j) {         pref[i][j] = pref[i][j - 1] + d[i][j];       }     }     while (m--) {       long long v, h;       scanf( %I64d%I64d , &v, &h);       int pr = -1;       long long ans = 0, len = 0;       while (v) {         int cntL = --upper_bound((d[2 * v]).begin(), (d[2 * v]).end(),                                  h - len - f[2 * v]) -                    d[2 * v].begin();         int cntR = --upper_bound((d[2 * v + 1]).begin(), (d[2 * v + 1]).end(),                                  h - len - f[2 * v + 1]) -                    d[2 * v + 1].begin();         if (pr == -1 && cntL != -1)           ans += 1LL * h * (cntL + 1) - (len + f[2 * v]) * (cntL + 1) -                  pref[2 * v][cntL];         if (pr == -1 && cntR != -1)           ans += 1LL * h * (cntR + 1) - (len + f[2 * v + 1]) * (cntR + 1) -                  pref[2 * v + 1][cntR];         if (pr == 0 && cntL != -1)           ans += 1LL * h * (cntL + 1) - (len + f[2 * v]) * (cntL + 1) -                  pref[2 * v][cntL];         if (pr == 1 && cntR != -1)           ans += 1LL * h * (cntR + 1) - (len + f[2 * v + 1]) * (cntR + 1) -                  pref[2 * v + 1][cntR];         if (len < h) ans += h - len;         len += f[v];         pr = v % 2 ^ 1;         v /= 2;       }       printf( %I64d n , ans);     }     return 0;   }   