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
| #include <cstdio> #include <iostream> using namespace std;
const int maxN = 3e5 + 7;
struct Edge { int from, to; }e[maxN << 1];
int n, m, head[maxN], cnt, val[maxN], f[maxN][31], d[maxN], minF[maxN][31], maxF[maxN][31], up[maxN][31], down[maxN][31];
inline void add(int u, int v) { e[++cnt].from = head[u]; e[cnt].to = v; head[u] = cnt; }
void dfs(int x, int fa) { d[x] = d[fa] + 1; f[x][0] = fa; maxF[x][0] = max(val[x], val[fa]); minF[x][0] = min(val[x], val[fa]); up[x][0] = max(0, val[fa] - val[x]); down[x][0] = max(0, val[x] - val[fa]); for(int i = 1; i <= 20; ++i) { f[x][i] = f[f[x][i - 1]][i - 1]; if(!f[x][i]) break; int y = f[x][i - 1]; maxF[x][i] = max(maxF[x][i - 1], maxF[y][i - 1]); minF[x][i] = min(minF[x][i - 1], minF[y][i - 1]); up[x][i] = max(max(up[x][i - 1], up[y][i - 1]), maxF[y][i - 1] - minF[x][i - 1]); down[x][i] = max(max(down[x][i - 1], down[y][i - 1]), maxF[x][i - 1] - minF[y][i -1]); } for(int i = head[x]; i; i = e[i].from) { int y = e[i].to; if(y == fa) continue; dfs(y, x); } }
inline int Lca(int x, int y) { if(d[x] > d[y]) swap(x, y); for(int i = 21; i >= 0; --i) if(d[f[y][i]] >= d[x]) y = f[y][i]; if(x == y) return x; for(int i = 21; i >= 0; --i) if(f[x][i] != f[y][i]) x = f[x][i], y = f[y][i]; return f[x][0]; }
inline int query(int x, int y) { int lca = Lca(x, y), ans = 0, maxNum = 0, minNum = 0x3f3f3f3f; int dep = d[x] - d[lca]; if(dep) { for(int i = 20; i >= 0; --i) if(dep & (1 << i)) { ans = max(ans, max(up[x][i], maxF[x][i] - minNum)); minNum = min(minNum, minF[x][i]); x = f[x][i]; } } dep = d[y] - d[lca]; if(dep) { for(int i = 20; i >= 0; --i) if(dep & (1 << i)) { ans = max(ans, max(down[y][i], maxNum - minF[y][i])); maxNum = max(maxNum, maxF[y][i]); y = f[y][i]; } } return max(ans, maxNum - minNum); }
int main() { scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%d", &val[i]); for(int i = 1; i < n; ++i) { int x, y; scanf("%d%d", &x, &y); add(x, y); add(y, x); } dfs(1, 0); scanf("%d", &m); for(int i = 1; i <= m; ++i) { int x, y; scanf("%d%d", &x, &y); printf("%d\n", query(x, y)); } return 0; }
|