func_code_string: #include <bits/stdc++.h>   using namespace std;   const int P = 1e9 + 7, INF = 0x3f3f3f3f;   long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }   long long qpow(long long a, long long n) {     long long r = 1 % P;     for (a %= P; n; a = a * a % P, n >>= 1)       if (n & 1) r = r * a % P;     return r;   }   long long inv(long long first) {     return first <= 1 ? 1 : inv(P % first) * (P - P / first) % P;   }   inline int rd() {     int first = 0;     char p = getchar();     while (p <  0  || p >  9 ) p = getchar();     while (p >=  0  && p <=  9 ) first = first * 10 + p -  0 , p = getchar();     return first;   }   const int N = 1e6 + 50;   int n, m, w[N], dep[N];   vector<pair<int, int>> g[N];   vector<pair<int, long long>> route[N];   void dfs(int first, int d) {     dep[first] = d;     for (auto &e : g[first]) dfs(e.first, d + e.second);   }   int p(int f, int first) {     if (first == f * 2) return first + 1;     return first - 1;   }   long long qry(int a, int h, int c) {     if (a > n || c > h) return 0;     auto p = --upper_bound(route[a].begin(), route[a].end(),                            pair<int, long long>(h - c, 1e18));     long long cnt = p - route[a].begin() + 1;     return cnt * (h - c) - p->second;   }   int main() {     scanf( %d%d , &n, &m);     for (int i = 2; i <= n; ++i) {       int u = i / 2, v = i;       scanf( %d , w + i);       g[u].push_back({v, w[i]});     }     dfs(1, 0);     for (int i = 1; i <= n; ++i) {       int j = i;       route[i].push_back({0, 0ll});       while (j != 1) {         j /= 2;         route[j].push_back({dep[i] - dep[j], 0ll});       }     }     for (int i = 1; i <= n; ++i) {       sort(route[i].begin(), route[i].end());       int sz = route[i].size();       for (int j = 1; j <= sz - 1; ++j)         route[i][j].second = route[i][j].first + route[i][j - 1].second;     }     while (m--) {       int a, h;       scanf( %d%d , &a, &h);       long long ans = qry(a, h, 0);       int c = 0;       while (1) {         c += w[a];         if (a == 1 || c > h) break;         int t = p(a / 2, a);         ans += qry(t, h, c + w[t]);         ans += h - c;         a /= 2;       }       printf( %lld n , ans);     }   }   