func_code_string: #include <bits/stdc++.h>   template <typename Y>   inline bool updmin(Y &a, Y b) {     if (a > b) {       a = b;       return 1;     }     return 0;   }   template <typename Y>   inline bool updmax(Y &a, Y b) {     if (a < b) {       a = b;       return 1;     }     return 0;   }   template <typename Y>   inline Y abs(Y a) {     if (a < 0) a = -a;     return a;   }   template <typename Y>   inline Y sqr(Y a) {     return a * a;   }   int read() {     int w = 1, q = 0, ch =    ;     for (; ch <  0  || ch >  9 ; ch = getchar())       if (ch ==  - ) w = -1;     for (; ch >=  0  && ch <=  9 ; ch = getchar()) q = q * 10 + ch - 48;     return q * w;   }   inline void FileIO() {     freopen(                     .in ,          r , stdin);     freopen(                     .out ,          w , stdout);   }   const int maxn = 800010;   std::vector<std::pair<int, long long> > G[maxn];   int n, m, fa[maxn];   long long a[maxn], d[maxn], dk[maxn], df[maxn];   int dep[maxn], dfn[maxn], st[maxn][21], dfc = 0, lg[maxn];   int lca(int a, int b) {     a = dfn[a];     b = dfn[b];     if (a > b) {       std::swap(a, b);     }     int L = lg[b - a], u = st[a][L], v = st[b - (1 << L) + 1][L];     return dep[u] < dep[v] ? u : v;   }   void up(int p) {     d[p] = a[p];     st[++dfc][0] = p;     dfn[p] = dfc;     dep[p] = dep[fa[p]] + 1;     for (auto t : G[p]) {       if (t.first == fa[p]) continue;       fa[t.first] = p;       up(t.first);       dk[t.first] = std::max(0LL, d[t.first] - 2 * t.second);       d[p] += dk[t.first];       st[++dfc][0] = p;     }   }   void down(int p) {     for (auto t : G[p]) {       if (t.first == fa[p]) continue;       df[t.first] = std::max(0LL, d[p] - dk[t.first] - 2 * t.second);       d[t.first] += df[t.first];       down(t.first);     }   }   long long ans[maxn];   std::vector<std::pair<int, int> > Q[maxn];   long long tr[maxn];   inline void add(int p, long long v) {     if (!p) return;     for (; p <= n; p += p & -p) {       tr[p] += v;     }   }   inline long long ask(int p) {     long long r = 0;     for (; p; p -= p & -p) {       r += tr[p];     }     return r;   }   inline long long ask(int l, int r) { return ask(r) - ask(l - 1); }   void dfs(int p, long long ev) {     add(dep[p] - 1, -ev - dk[p]);     add(dep[p], d[p] - df[p]);     for (auto q : Q[p]) {       ans[q.second] += ask(dep[q.first], dep[p]);     }     for (auto t : G[p]) {       if (t.first == fa[p]) continue;       dfs(t.first, t.second);     }     add(dep[p] - 1, ev + dk[p]);     add(dep[p], df[p] - d[p]);   }   int main() {     n = read();     m = read();     for (int i = 1; i <= n; i++) {       a[i] = read();     }     for (int i = 1; i < n; i++) {       int x = read(), y = read();       long long z = read();       G[x].push_back(std::make_pair(y, z));       G[y].push_back(std::make_pair(x, z));     }     up(1);     down(1);     lg[1] = 0;     for (int i = 2; i <= dfc; i++) {       lg[i] = lg[i >> 1] + 1;     }     for (int k = 1; k <= 20; k++) {       for (int i = 1; i + (1 << k) - 1 <= dfc; i++) {         int u = st[i][k - 1], v = st[i + (1 << (k - 1))][k - 1];         st[i][k] = dep[u] < dep[v] ? u : v;       }     }     for (int i = 1; i <= m; i++) {       int u = read(), v = read();       if (u == v) {         ans[i] = d[u];         continue;       }       int l = lca(u, v);       if (l != u && l != v) {         ans[i] += 2 * df[l] - d[l];       } else {         ans[i] += df[l];       }       if (l != u) {         Q[u].push_back(std::make_pair(l, i));       }       if (l != v) {         Q[v].push_back(std::make_pair(l, i));       }     }     dfs(1, 0);     for (int i = 1; i <= m; i++) {       printf( %lld n , ans[i]);     }     return 0;   }   