func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long N = 2001111;   long long n, m, k;   long long md = 1000000007;   long long a[N];   set<long long> s;   long long len[N];   vector<long long> t[N];   vector<long long> pref[N];   void merge(vector<long long> &t, vector<long long> a, vector<long long> b,              long long x, long long y) {     long long i = 0;     long long j = 0;     while (i < a.size() && j < b.size()) {       if (a[i] + x <= b[j] + y) {         t.push_back(a[i] + x);         i++;       } else {         t.push_back(b[j] + y);         j++;       }     }     while (i < a.size()) {       t.push_back(a[i] + x);       i++;     }     while (j < b.size()) {       t.push_back(b[j] + y);       j++;     }   }   void build(long long x) {     if (x * 2 <= n) {       build(x * 2);     }     if (x * 2 + 1 <= n) {       build(x * 2 + 1);     }     t[x].push_back(0);     merge(t[x], t[x * 2], t[x * 2 + 1], len[x * 2], len[x * 2 + 1]);     pref[x].push_back(t[x][0]);     for (long long i = 1; i < t[x].size(); i++) {       pref[x].push_back(t[x][i] + pref[x][i - 1]);     }   }   signed main() {     ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);     cin >> n >> m;     for (long long i = 2; i <= n; i++) {       cin >> len[i];     }     build(1);     long long ans = 0;     for (long long i = 1; i <= m; i++) {       long long x, h;       cin >> x >> h;       long long pos = upper_bound(t[x].begin(), t[x].end(), h) - t[x].begin() - 1;       ans = ans + (pos + 1) * h - pref[x][pos];       long long prev = x;       h -= len[x];       x /= 2;       while (x >= 1) {         if (h <= 0) {           break;         }         ans += h;         if (x * 2 != prev && x * 2 <= n) {           h -= len[x * 2];           pos = upper_bound(t[x * 2].begin(), t[x * 2].end(), h) -                 t[x * 2].begin() - 1;           if (pos >= 0) ans = ans + (pos + 1) * h - pref[2 * x][pos];           h += len[x * 2];         }         if (x * 2 + 1 != prev && x * 2 + 1 <= n) {           h -= len[x * 2 + 1];           pos = upper_bound(t[x * 2 + 1].begin(), t[x * 2 + 1].end(), h) -                 t[x * 2 + 1].begin() - 1;           if (pos >= 0) ans = ans + (pos + 1) * h - pref[2 * x + 1][pos];           h += len[x * 2 + 1];         }         h -= len[x];         prev = x;         x /= 2;       }       cout << ans <<   n ;       ans = 0;     }     return 0;   }   