func_code_string: #include <bits/stdc++.h>   using namespace std;   vector<vector<int> > v;   vector<vector<int> > vv;   vector<vector<long long int> > dp;   void merg(int x) {     if (v[x].size() == 1) return;     if (v[x].size() == 2) {       vector<int> v1;       v1.push_back(0);       for (int i = 0; i < v[x * 2].size(); i++) {         v1.push_back(v[x * 2][i] + v[x][1]);       }       v[x] = v1;       return;     }     vector<int> v1 = v[x * 2];     vector<int> v2 = v[x * 2 + 1];     for (int i = 0; i < v1.size(); i++) v1[i] += v[x][1];     for (int i = 0; i < v2.size(); i++) v2[i] += v[x][2];     v[x].resize(1);     int idx1 = 0;     int idx2 = 0;     while (idx1 < v1.size() && idx2 < v2.size()) {       if (v1[idx1] < v2[idx2]) {         v[x].push_back(v1[idx1]);         idx1++;       } else {         v[x].push_back(v2[idx2]);         idx2++;       }     }     while (idx1 != v1.size()) v[x].push_back(v1[idx1++]);     while (idx2 != v2.size()) v[x].push_back(v2[idx2++]);   }   int bs(int a, int h, int l, int r) {     if (l == r) return l;     int mid = (l + r) / 2;     if (v[a][mid] > h) return bs(a, h, l, mid);     if (v[a][mid + 1] > h) return mid;     return bs(a, h, mid + 1, r);   }   long long int cal(int a, long long int h) {     if (h < 0) return 0;     long long int ans = 0;     int x = bs(a, h, 0, v[a].size() - 1);     ans = h * ((long long int)(x + 1)) - dp[a][x];     return ans;   }   int main() {     std::ios_base::sync_with_stdio(false);     std::cin.tie(nullptr);     int n, m;     cin >> n >> m;     v.resize(n + 3);     vv.resize(n + 3);     dp.resize(n + 3);     for (int i = 1; i <= n; i++) v[i].push_back(0);     int x;     for (int i = 1; i <= n - 1; i++) {       cin >> x;       v[(i + 1) / 2].push_back(x);       vv[(i + 1) / 2].push_back(x);     }     for (int i = n; i >= 1; i--) merg(i);     for (int i = 1; i <= n; i++) {       dp[i].push_back(v[i][0]);       for (int j = 1; j < v[i].size(); j++) {         dp[i].push_back(((long long int)(v[i][j])) + dp[i][j - 1]);       }     }     for (int i = 0; i < m; i++) {       int a, h;       cin >> a >> h;       long long int ans = 0;       ans += cal(a, h);       while (a != 1) {         if (a % 2 == 0) {           a /= 2;           if (h - vv[a][0] <= 0) break;           ans += h - vv[a][0];           if (vv[a].size() == 2) {             h = h - vv[a][0] - vv[a][1];             a = a * 2 + 1;             ans += cal(a, h);             a /= 2;             h += vv[a][1];           } else {             h -= vv[a][0];           }         } else {           a /= 2;           if (h - vv[a][1] <= 0) break;           ans += h - vv[a][1];           h = h - vv[a][0] - vv[a][1];           a = a * 2;           ans += cal(a, h);           a /= 2;           h += vv[a][0];         }       }       cout << ans << endl;     }   }   