func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long N = 2e5 + 10, inf = 1e18;   struct SegTree {     long long l[N << 2], r[N << 2];     long long mn[N << 2], tag[N << 2];     inline void push_up(long long i) { mn[i] = min(mn[i << 1], mn[i << 1 | 1]); }     inline void push_down(long long i) {       mn[i << 1] += tag[i];       mn[i << 1 | 1] += tag[i];       tag[i << 1] += tag[i];       tag[i << 1 | 1] += tag[i];       tag[i] = 0;     }     void build(long long i, long long x, long long y) {       l[i] = x;       r[i] = y;       if (x == y) return;       build(i << 1, x, (x + y) >> 1);       build(i << 1 | 1, ((x + y) >> 1) + 1, y);     }     void update(long long i, long long x, long long y, long long k) {       if (l[i] >= x && r[i] <= y) {         mn[i] += k;         tag[i] += k;         return;       }       push_down(i);       if (r[i << 1] >= x) update(i << 1, x, y, k);       if (l[i << 1 | 1] <= y) update(i << 1 | 1, x, y, k);       push_up(i);     }     long long query(long long i, long long x, long long y) {       if (l[i] >= x && r[i] <= y) return mn[i];       push_down(i);       long long ans = inf;       if (r[i << 1] >= x) ans = min(ans, query(i << 1, x, y));       if (l[i << 1 | 1] <= y) ans = min(ans, query(i << 1 | 1, x, y));       push_up(i);       return ans;     }   };   SegTree dis1, dis2;   long long n, m, cnt, u[N << 2], v[N << 2], c[N << 2], f[N], dfn[N], siz[N],       dep[N];   vector<pair<long long, long long> > edge[N];   long long dfs(long long u, long long sum, long long depth) {     cnt++;     dep[u] = depth;     dfn[u] = cnt;     siz[u] = 1;     dis1.update(1, dfn[u], dfn[u], sum);     dis2.update(1, dfn[u], dfn[u], sum + f[u]);     for (long long i = 0; i < edge[u].size(); i++)       siz[u] += dfs(edge[u][i].first, sum + edge[u][i].second, dep[u] + 1);     return siz[u];   }   int main() {     scanf( %lld%lld , &n, &m);     dis1.build(1, 1, n);     dis2.build(1, 1, n);     for (long long i = 1; i <= n - 1; i++) {       scanf( %lld%lld%lld , &u[i], &v[i], &c[i]);       edge[u[i]].push_back(make_pair(v[i], c[i]));     }     for (long long i = n; i <= 2 * n - 2; i++) {       scanf( %lld%lld%lld , &u[i], &v[i], &c[i]);       f[u[i]] = c[i];     }     dfs(1ll, 0ll, 1ll);     while (m--) {       long long op, x, y;       scanf( %lld%lld%lld , &op, &x, &y);       if (op == 1) {         if (x <= n - 1) {           dis1.update(1ll, dfn[v[x]], dfn[v[x]] + siz[v[x]] - 1, y - c[x]);           dis2.update(1ll, dfn[v[x]], dfn[v[x]] + siz[v[x]] - 1, y - c[x]);           c[x] = y;         } else {           dis2.update(1ll, dfn[u[x]], dfn[u[x]], y - f[u[x]]);           f[u[x]] = y;         }       } else {         if (dfn[x] <= dfn[y] && dfn[x] + siz[x] - 1 >= dfn[y]) {           printf( %lld n , dis1.query(1ll, dfn[y], dfn[y]) -                                dis1.query(1ll, dfn[x], dfn[x]));         } else {           printf( %lld n , dis2.query(1ll, dfn[x], dfn[x] + siz[x] - 1) -                                dis1.query(1ll, dfn[x], dfn[x]) +                                dis1.query(1ll, dfn[y], dfn[y]));         }       }     }     return 0;   }   