fork download
  1. // Author: 4uckd3v - Nguyen Cao Duc
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6.  
  7. const int MAX_N = 2e5;
  8. const int MOD = 1e9 + 7;
  9.  
  10. int n, q, lg, timer;
  11. int a[MAX_N + 5], tin[MAX_N + 5], tout[MAX_N + 5], depth[MAX_N + 5];
  12. int up[MAX_N + 5][20], f[MAX_N + 5][20];
  13. ll dp[MAX_N + 5];
  14. vector<int> adj[MAX_N + 5];
  15.  
  16. void dfs(int u, int par) {
  17. tin[u] = ++timer;
  18. up[u][0] = par;
  19. f[u][0] = a[u];
  20. depth[u] = depth[par] + 1;
  21.  
  22. for (int i = 1; i <= lg; i++) {
  23. up[u][i] = up[up[u][i - 1]][i - 1];
  24. f[u][i] = max(f[u][i - 1], f[up[u][i - 1]][i - 1]);
  25. };
  26.  
  27. for (int v : adj[u]) {
  28. if (v == par) continue;
  29. dfs(v, u);
  30. };
  31.  
  32. tout[u] = ++timer;
  33. };
  34.  
  35. bool isAncestor(int u, int v) {
  36. return tin[u] <= tin[v] && tout[u] >= tout[v];
  37. };
  38.  
  39. int __lca(int u, int v) {
  40. if (isAncestor(u, v)) return u;
  41. if (isAncestor(v, u)) return v;
  42.  
  43. for (int i = lg; i >= 0; i--)
  44. if (!isAncestor(up[u][i], v))
  45. u = up[u][i];
  46.  
  47. return up[u][0];
  48. };
  49.  
  50. int maxWeight(int u, int v) {
  51. int lca = __lca(u, v);
  52. int distU = depth[u] - depth[lca];
  53. int distV = depth[v] - depth[lca];
  54.  
  55. int res = 0;
  56. for (int i = lg; i >= 0; i--) {
  57. if (distU >> i & 1) {
  58. res = max(res, f[u][i]);
  59. u = up[u][i];
  60. };
  61. if (distV >> i & 1) {
  62. res = max(res, f[v][i]);
  63. v = up[v][i];
  64. };
  65. };
  66.  
  67. res = max({res, f[u][0], f[v][0]});
  68.  
  69. return res;
  70. };
  71.  
  72. int main() {
  73. ios_base::sync_with_stdio(0);
  74. cin.tie(0);
  75. if (fopen("SHIP.INP", "r")) {
  76. freopen("SHIP.INP", "r", stdin);
  77. freopen("SHIP.OUT", "w", stdout);
  78. };
  79.  
  80. cin >> n;
  81. for (int i = 1; i <= n; i++) {
  82. cin >> a[i];
  83. };
  84.  
  85. for (int i = 1; i < n; i++) {
  86. int u, v;
  87. cin >> u >> v;
  88. adj[u].push_back(v);
  89. adj[v].push_back(u);
  90. };
  91.  
  92. lg = ceil(log2(n));
  93. dfs(1, 1);
  94.  
  95. for (int u = 1; u <= n; u++) dp[u] = -1e18;
  96. dp[1] = 0;
  97.  
  98. cin >> q;
  99. while (q--) {
  100. int u, v;
  101. cin >> u >> v;
  102. dp[v] = max(dp[v], dp[u] + maxWeight(u, v));
  103. };
  104.  
  105. cout << *max_element(dp + 1, dp + n + 1) << '\n';
  106. };
Success #stdin #stdout 0.01s 13076KB
stdin
Standard input is empty
stdout
0