Advertisement
willy108

CSES_1137

Nov 12th, 2020
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.12 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <cassert>
  6. #include <vector>
  7. #include <algorithm>
  8. #define max_v 410000
  9. #define cont continue
  10. using namespace std;
  11. int l[max_v], r[max_v], ord[max_v];
  12. long long BIT[max_v], arr[max_v];
  13.  
  14.  
  15. vector<int> adj[max_v];
  16. int n, q, cnt = 0;
  17.  
  18. void U(int k, long long val){ for(; k <=max_v - 1; k += k&-k) BIT[k] += val; }
  19. long long S(int k){ return (!k) ? 0ll : BIT[k] + S(k - (k&-k)); }
  20.  
  21. void dfs(int u, int p){
  22.   l[u] = ++cnt;
  23.   ord[cnt] = u;
  24.  
  25.   for(int v : adj[u]){
  26.     if(v == p) cont;
  27.     dfs(v, u);
  28.   }
  29.   r[u] = ++cnt;
  30.   ord[cnt] = u;
  31.   U(cnt, arr[u]);
  32. }
  33.  
  34.  
  35.  
  36.  
  37. int main(){
  38.   scanf("%d%d", &n, &q);
  39.   for(int i = 1; i<=n; i++){
  40.     scanf("%lld", &arr[i]);
  41.   }
  42.  
  43.   for(int i = 1; i<n; i++){
  44.     int a, b;
  45.     scanf("%d%d", &a, &b);
  46.     adj[a].push_back(b);
  47.     adj[b].push_back(a);
  48.   }
  49.   dfs(1, 0);
  50.   while(q--){
  51.     int op;
  52.     scanf("%d", &op);
  53.     if(op - 1){
  54.       int u;
  55.       scanf("%d", &u);
  56.       printf("%lld\n", S(r[u]) - S(l[u]));
  57.     }else{
  58.       int u; long long k;
  59.       scanf("%d%lld", &u, &k);
  60.       U(r[u], k - arr[u]);
  61.       arr[u] = k;
  62.     }
  63.   }
  64.   return 0;
  65. }
  66.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement