1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| #include <bits/stdc++.h>
#define INF 0x3f3f3f3f #define EPS 1e-8 #define FOR(i, l, r) for (ll(i) = (l); (i) <= (r); ++(i)) #define log printf #define IOS \ ios::sync_with_stdio(false); \ cin.tie(nullptr); \ cout.tie(nullptr);
using namespace std;
typedef __int128 i128; typedef long long ll; typedef pair<ll, ll> PII;
const ll N = 2e5 + 10; ll n, t, u, v, w, a[N], l1, l2, r1, r2, lg2[N], dis[N], st1[30][N], st2[30][N], st3[30][N], st4[30][N]; vector<PII> g[N];
template <typename T>
inline T read() { T sum = 0, fl = 1; char ch = getchar(); for (; !isdigit(ch); ch = getchar()) if (ch == '-') fl = -1; for (; isdigit(ch); ch = getchar()) sum = sum * 10 + ch - '0'; return sum * fl; }
template <typename T>
inline void write(T x) { if (x < 0) { putchar('-'), write<T>(-x); return; } static T sta[35]; ll top = 0; do { sta[top++] = x % 10, x /= 10; } while (x); while (top) putchar(sta[--top] + 48); }
void init() { lg2[2] = 1; FOR(i, 1, n) { st1[0][i] = st2[0][i] = dis[i] * dis[i] * dis[i] + a[i]; st3[0][i] = st4[0][i] = dis[i] * dis[i] * dis[i] - a[i]; } FOR(i, 3, n) lg2[i] = lg2[i >> 1] + 1; FOR(i, 1, lg2[n]) { ll len = 1 << i; FOR(j, 1, n - len + 1) { st1[i][j] = max(st1[i - 1][j], st1[i - 1][j + (len >> 1)]); st2[i][j] = min(st2[i - 1][j], st2[i - 1][j + (len >> 1)]); st3[i][j] = max(st3[i - 1][j], st3[i - 1][j + (len >> 1)]); st4[i][j] = min(st4[i - 1][j], st4[i - 1][j + (len >> 1)]); } } }
ll queryMax1(ll l, ll r) { ll k = lg2[r - l + 1], len = 1 << k; return max(st1[k][l], st1[k][r - len + 1]); }
ll queryMin1(ll l, ll r) { ll k = lg2[r - l + 1], len = 1 << k; return min(st2[k][l], st2[k][r - len + 1]); }
ll queryMax2(ll l, ll r) { ll k = lg2[r - l + 1], len = 1 << k; return max(st3[k][l], st3[k][r - len + 1]); }
ll queryMin2(ll l, ll r) { ll k = lg2[r - l + 1], len = 1 << k; return min(st4[k][l], st4[k][r - len + 1]); }
void dfs(ll now, ll fa) { for (auto v : g[now]) { if (v.first == fa) continue; dis[v.first] = dis[now] + v.second; dfs(v.first, now); } }
int main() { n = read<ll>(), t = read<ll>(); FOR(i, 1, n) a[i] = read<ll>(); FOR(i, 2, n) { u = read<ll>(), v = read<ll>(), w = read<ll>(); g[u].push_back({v, w}), g[v].push_back({u, w}); } dfs(1, -1); init(); while (t--) { l1 = read<ll>(), r1 = read<ll>(), l2 = read<ll>(), r2 = read<ll>(); write<ll>(max({queryMax1(l1, r1) - queryMin1(l2, r2), queryMax1(l2, r2) - queryMin1(l1, r1), queryMax2(l1, r1) - queryMin2(l2, r2), queryMax2(l2, r2) - queryMin2(l1, r1)})), putchar('\n'); } return 0; }
|