func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, q, si = 1, leaf;   long long ans[500010];   struct Q {     int s, e, ind;   };   vector<Q> query[500010];   vector<pair<int, int>> tree[500010];   int rs[500010];   struct seg {     long long seg[2000010], lazy[2000010];     void prop(int x) {       seg[x] += lazy[x];       if (x < si) {         lazy[x * 2] += lazy[x];         lazy[x * 2 + 1] += lazy[x];       }       lazy[x] = 0;       return;     }     void add(int s, int e, long long v) {       if (s > e) return;       add(1, 1, si, s, e, v);     }     void add(int x, int l, int r, int s, int e, long long v) {       prop(x);       if (r < s || e < l) return;       if (s <= l && r <= e) {         lazy[x] += v;         prop(x);         return;       }       add(x * 2, l, (l + r) / 2, s, e, v);       add(x * 2 + 1, (l + r) / 2 + 1, r, s, e, v);       seg[x] = min(seg[x * 2], seg[x * 2 + 1]);     }     long long get(int s, int e) { return get(1, 1, si, s, e); }     long long get(int x, int l, int r, int s, int e) {       prop(x);       if (r < s || e < l) return 1000000000000000LL;       if (s <= l && r <= e) return seg[x];       return min(get(x * 2, l, (l + r) / 2, s, e),                  get(x * 2 + 1, (l + r) / 2 + 1, r, s, e));     }   } S;   void makeup(int x, long long dis) {     rs[x] = x;     if (tree[x].size() == 0) {       S.add(x, x, dis);       return;     } else       S.add(x, x, 1000000000000000LL);     for (auto i : tree[x]) {       makeup(i.first, dis + i.second);       rs[x] = max(rs[x], rs[i.first]);     }   }   void dfs(int x) {     for (auto i : query[x]) ans[i.ind] = S.get(i.s, i.e);     for (auto i : tree[x]) {       S.add(i.first, rs[i.first], -i.second);       S.add(1, i.first - 1, i.second);       S.add(rs[i.first] + 1, n, i.second);       dfs(i.first);       S.add(i.first, rs[i.first], i.second);       S.add(1, i.first - 1, -i.second);       S.add(rs[i.first] + 1, n, -i.second);     }   }   int main() {     int i, a, b, c;     scanf( %d %d , &n, &q);     while (si < n) si <<= 1;     for (i = 2; i <= n; i++) {       scanf( %d %d , &a, &b);       tree[a].push_back({i, b});     }     for (i = 1; i <= q; i++) {       scanf( %d %d %d , &a, &b, &c);       query[a].push_back({b, c, i});     }     makeup(1, 0);     dfs(1);     for (i = 1; i <= q; i++) printf( %lld n , ans[i]);   }   