func_code_string: #include <bits/stdc++.h>   using namespace std;   #pragma warning(disable : 4996)   struct Edge {     int to, w;   };   const int N = 3e5 + 5, L = 20;   vector<Edge> v[N];   int a[N], tin[N], tout[N], p[N][L];   long long maxPath[N], maxUpPath[N], sum[N], pt[N], ancw[N];   int timer = 0;   bool upper(int a, int b) { return tin[a] <= tin[b] && tout[a] >= tout[b]; }   int getBeforeLca(int a, int b) {     if (upper(a, b)) return -1;     for (int i = L - 1; i >= 0; i--) {       if (!upper(p[a][i], b)) a = p[a][i];     }     return a;   }   void dfs(int node, int anc) {     p[node][0] = anc;     for (int i = 1; i < L; i++) {       p[node][i] = p[p[node][i - 1]][i - 1];     }     tin[node] = timer++;     sum[node] = maxPath[node] = a[node];     for (auto e : v[node]) {       if (e.to != anc) {         ancw[e.to] = e.w;         dfs(e.to, node);         maxPath[e.to] = max(0ll, maxPath[e.to] - e.w * 2);         maxPath[node] += maxPath[e.to];         sum[node] += maxPath[e.to];       }     }     tout[node] = timer;   }   void deep(int node, long long x, long long y, int anc) {     maxUpPath[node] = x - y;     x += sum[node];     for (auto e : v[node]) {       if (e.to != anc) {         pt[e.to] = pt[node] - e.w + sum[node] - maxPath[e.to];         long long nx = x - e.w * 2 - maxPath[e.to];         deep(e.to, nx, min(y, nx), node);       }     }   }   signed main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     int n, q;     cin >> n >> q;     for (int i = 0; i < n; i++) {       cin >> a[i];     }     for (int i = 0; i < n - 1; i++) {       int a, b, w;       cin >> a >> b >> w;       a--, b--;       v[a].push_back({b, w});       v[b].push_back({a, w});     }     dfs(0, 0);     deep(0, 0, 0, -1);     for (int i = 0; i < q; i++) {       int x, y, xx, yy, lca;       cin >> x >> y;       x--, y--;       xx = getBeforeLca(x, y);       yy = getBeforeLca(y, x);       lca = xx == -1 ? x : p[xx][0];       long long ans = maxUpPath[lca] + sum[lca];       if (x != lca) {         ans += sum[x] - maxPath[xx] + pt[x] - pt[xx] - ancw[xx];       }       if (y != lca) {         ans += sum[y] - maxPath[yy] + pt[y] - pt[yy] - ancw[yy];       }       cout << ans <<   n ;     }     return 0;   }   