fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. const int N = 2e5 + 5;
  12.  
  13. // Euler Tour cho Truy vấn cây con: Ta thêm u vào Euler Tour khi dfs đi vào u
  14. // - Đỉnh u là tổ tiên của đỉnh v nếu tin(v) nằm trong đoạn [tin(u), tout(u)]
  15. // (Hoặc có thể sử dụng điều kiện đoạn [tin(v), tout(v)] nằm trong đoạn [tin(u), tout(u)])
  16. // => Cây con gốc u sẽ tương ứng với đoạn [tin(u), tout(u)] trên Euler Tour
  17. // - (Biết thêm) Với 2 đỉnh u, v bất kì hoặc là đoạn này bao lấy đoạn kia (u, v có quan hệ tổ tiên)
  18. // hoặc hai đoạn không giao nhau (u, v không có quan hệ tổ tiên (nằm khác nhánh))
  19.  
  20. // Biến đổi truy vấn trong bài:
  21. // 1. Update đỉnh u => Update tin(u) => Update 1 điểm
  22. // 2. Tính tổng cây con gốc u => Tính tổng đoạn [tin(u), tout(u)] => Tính tổng 1 đoạn
  23. // => Có thể sử dụng Fenwick Tree / Segment Tree
  24.  
  25. int n, q;
  26. int a[N];
  27. vector<int> adj[N];
  28.  
  29. int tin[N]; // tin[u] = thời gian dfs đi vào đỉnh u
  30. int tout[N]; // tout[u] = thời gian dfs đi ra khỏi đỉnh u
  31. int timer;
  32.  
  33. void dfs(int u, int p) {
  34. tin[u] = ++timer;
  35. for (int v : adj[u]) {
  36. if (v == p) continue;
  37. dfs(v, u);
  38. }
  39. tout[u] = timer;
  40. }
  41.  
  42. struct Fenwick {
  43. int n;
  44. vector<ll> ft;
  45.  
  46. Fenwick(int n) : n(n) {
  47. ft.resize(n, 0);
  48. }
  49.  
  50. void update(int pos, int val) {
  51. for (; pos <= n; pos += pos & (-pos)) {
  52. ft[pos] += val;
  53. }
  54. }
  55.  
  56. ll get(int pos) {
  57. ll ans = 0;
  58. for (; pos > 0; pos -= pos & (-pos)) {
  59. ans += ft[pos];
  60. }
  61. return ans;
  62. }
  63. };
  64.  
  65. int main() {
  66. ios::sync_with_stdio(false);
  67. cin.tie(nullptr);
  68. cin >> n >> q;
  69. for (int u = 1; u <= n; u++) cin >> a[u];
  70.  
  71. for (int i = 0; i < n - 1; i++) {
  72. int u, v;
  73. cin >> u >> v;
  74. adj[u].push_back(v);
  75. adj[v].push_back(u);
  76. }
  77.  
  78. timer = 0;
  79. dfs(1, -1);
  80.  
  81. Fenwick fenw(n + 1);
  82. for (int u = 1; u <= n; u++) {
  83. fenw.update(tin[u], a[u]);
  84. }
  85.  
  86. while (q--) {
  87. int type, u;
  88. cin >> type >> u;
  89.  
  90. if (type == 1) {
  91. int val;
  92. cin >> val;
  93. fenw.update(tin[u], -a[u] + val);
  94. a[u] = val;
  95. }
  96. else {
  97. ll ans = fenw.get(tout[u]) - fenw.get(tin[u] - 1);
  98. cout << ans << '\n';
  99. }
  100. }
  101. }
Success #stdin #stdout 0.01s 8520KB
stdin
5 3
4 2 5 2 1
1 2
1 3
3 4
3 5
2 3
1 5 3
2 3
stdout
8
10