func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long N = 1e6 + 1;   const long long M = 1e5 + 1;   vector<int> len;   vector<int> dist[N];   vector<long long> pre[N];   long long n, m;   void mer(long long v, long long l, long long addl, long long r,            long long addr) {     dist[v].push_back(0);     long long sl = dist[l].size();     long long sr = dist[r].size();     long long pl = 0;     long long pr = 0;     while (pl < sl && pr < sr) {       if (dist[l][pl] + addl <= dist[r][pr] + addr) {         dist[v].push_back(dist[l][pl] + addl);         pl++;       } else {         dist[v].push_back(dist[r][pr] + addr);         pr++;       }     }     while (pl < sl) {       dist[v].push_back(dist[l][pl] + addl);       pl++;     }     while (pr < sr) {       dist[v].push_back(dist[r][pr] + addr);       pr++;     }     return;   }   void bfs(long long v) {     if (v > n) return;     long long l = 2 * v;     long long r = 2 * v + 1;     bool cl = false, cr = false;     if (l <= n) {       bfs(l);       cl = true;     }     if (r <= n) {       bfs(r);       cr = true;     }     if (cl && cr) {       long long addl = len[2 * v - 1];       long long addr = len[2 * v];       mer(v, l, addl, r, addr);     } else if (cl && !cr) {       long long addl = len[2 * v - 1];       dist[v].push_back(0);       for (long long x : dist[l]) dist[v].push_back(addl + x);     } else if (cr && !cl) {       long long addr = len[2 * v];       dist[v].push_back(0);       for (long long x : dist[r]) dist[v].push_back(addr + x);     } else {       dist[v].push_back(0);     }     long long sze = dist[v].size();     pre[v].resize(sze);     long long prev = 0ll;     for (long long i = 0; i < sze; i++) {       pre[v][i] = prev + dist[v][i];       prev = pre[v][i];     }     return;   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(NULL);     len.push_back(-1);     cin >> n >> m;     for (long long i = 0; i < n - 1; i++) {       long long x;       cin >> x;       len.push_back(x);     }     bfs(1);     for (long long i = 0; i < m; i++) {       long long ans = 0ll;       long long a, h;       cin >> a >> h;       long long opt = 3;       while (a >= 1) {         if (h < 0) break;         if (opt == 3) {           long long cnt =               (upper_bound(dist[a].begin(), dist[a].end(), h) - dist[a].begin());           if (cnt > 0) ans += (cnt)*h - pre[a][cnt - 1];         } else if (opt == 2) {           ans += h;           if (2 * a <= n) {             long long cnt = (upper_bound(dist[2 * a].begin(), dist[2 * a].end(),                                          h - len[2 * a - 1]) -                              dist[2 * a].begin());             if (cnt > 0)               ans += (cnt) * (h - len[2 * a - 1]) - pre[2 * a][cnt - 1];           }         } else {           if (h > 0) ans += h;           if (2 * a + 1 <= n) {             long long cnt = (upper_bound(dist[2 * a + 1].begin(),                                          dist[2 * a + 1].end(), h - len[2 * a]) -                              dist[2 * a + 1].begin());             if (cnt > 0)               ans += (cnt) * (h - len[2 * a]) - pre[2 * a + 1][cnt - 1];           }         }         if (a % 2) {           h -= len[2 * (a / 2)];           opt = 2;         } else {           h -= len[2 * (a / 2) - 1];           opt = 1;         }         a /= 2;       }       cout << ans << endl;     }   }   