func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long modn = 1000000007;   inline long long mod(long long x) { return x % modn; }   template <class num>   inline void rd(num &x) {     char c;     while (isspace(c = getchar()))       ;     bool neg = false;     if (!isdigit(c))       neg = (c ==  - ), x = 0;     else       x = c -  0 ;     while (isdigit(c = getchar())) x = (x << 3) + (x << 1) + c -  0 ;     if (neg) x = -x;   }   int n;   const int N = 1123456;   vector<long long> query[N];   vector<pair<long long, long long> > ans[N];   int A[N];   long long H[N], l[N];   long long acc[N], tmp[N];   int tn;   void dfs(int u, long long d) {     if (u > n) return;     tmp[tn++] = d;     dfs(2 * u, d + l[2 * u]);     dfs(2 * u + 1, d + l[2 * u + 1]);   }   void answer_for(int u) {     tn = 0;     dfs(u, 0);     sort(tmp, tmp + tn);     acc[0] = tmp[0];     for (int i = 1; i < tn; i++) acc[i] = acc[i - 1] + tmp[i];     sort(query[u].begin(), query[u].end());     ans[u].resize(query[u].size());     for (int i = int(query[u].size()) - 1; i >= 0; i--) {       while (tn > 0 && tmp[tn - 1] > query[u][i]) tn--;       ans[u][i] = pair<long long, long long>(tn, tn ? acc[tn - 1] : 0ll);     }   }   inline void reg(int u, long long v) { query[u].push_back(v); }   inline pair<long long, long long> get(int u, long long v) {     return ans[u][lower_bound(query[u].begin(), query[u].end(), v) -                   query[u].begin()];   }   int main() {     int m;     int i;     rd(n);     rd(m);     for (i = 2; i <= n; i++) rd(l[i]);     for (i = 0; i < m; i++) {       rd(A[i]);       rd(H[i]);       int ai = A[i];       long long hi = H[i];       reg(ai, hi);       int nx = ai;       hi -= l[ai];       ai = ai / 2;       while (ai && hi > 0) {         reg(ai, hi);         if (hi - l[nx] > 0) reg(nx, hi - l[nx]);         nx = ai;         hi -= l[ai];         ai = ai / 2;       }     }     for (int i = 1; i <= n; i++) answer_for(i);     for (i = 0; i < m; i++) {       int ai = A[i];       long long hi = H[i];       pair<long long, long long> ans = get(ai, hi);       int nx = ai;       hi -= l[ai];       ai = ai / 2;       while (ai && hi > 0) {         pair<long long, long long> p = get(ai, hi);         ans.first += p.first;         ans.second += p.first * (H[i] - hi) + p.second;         if (hi - l[nx] > 0) {           pair<long long, long long> p = get(nx, hi - l[nx]);           ans.first -= p.first;           ans.second -= p.first * (H[i] - hi + l[nx]) + p.second;         }         nx = ai;         hi -= l[ai];         ai = ai / 2;       }       printf( %lld n , ans.first * H[i] - ans.second);     }   }   