Advertisement
fooker

subtree queries

Jan 4th, 2024
824
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4.  
  5. const ll nmax = 1e9+7;
  6. const ll nmax2 = 998244353;
  7.  
  8. int main(){
  9.     std::ios_base::sync_with_stdio(false);
  10.     std::cin.tie(0);
  11.     std::cout.tie(0);
  12.  
  13.     ll n, q;
  14.     std::cin >> n >> q;
  15.     ll a[n + 1], b[n + 1];
  16.     for (ll i = 1; i <= n; i++){
  17.         std::cin >> b[i];
  18.         a[i] = 0;
  19.     }
  20.  
  21.     std::vector<ll> adj[n + 1];
  22.     for (ll i = 1, x, y; i < n; i++){
  23.         std::cin >> x >> y;
  24.         adj[x].push_back(y);
  25.         adj[y].push_back(x);
  26.     }
  27.  
  28.     ll siz[n + 1];
  29.     for (ll i = 1; i <= n; i++) siz[i] = 0;
  30.     std::vector<ll> euler_tour;
  31.     std::function<ll(ll, ll)> dfs = [&] (ll u, ll p) {
  32.         siz[u] = 1;
  33.         euler_tour.push_back(u);
  34.         for (auto v : adj[u]){
  35.             if (v != p){
  36.                 siz[u] += dfs(v, u);
  37.             }
  38.         }
  39.         return siz[u];
  40.     };
  41.     siz[0] = dfs(1, 0);
  42.     ll rev[n + 1];
  43.     for (ll i = 0; i < euler_tour.size(); i++){
  44.         rev[euler_tour[i]] = i + 1;
  45.         a[i + 1] = b[euler_tour[i]];
  46.     }
  47.  
  48.     ll tree[2 * n + 3];
  49.     for (ll i = 1; i <= n; i++) tree[n + i - 1] = a[i];
  50.    
  51.     for (ll i = n - 1; i > 0; i--) tree[i] = tree[i << 1] + tree[i << 1 | 1];
  52.    
  53.     auto query = [&] (ll l_, ll r_) -> ll {
  54.         ll res = 0;
  55.         for (l_ += n - 1, r_ += n - 1; l_ < r_; l_ >>= 1, r_ >>= 1){
  56.             if (l_&1) res += tree[l_++];
  57.             if (r_&1) res += tree[--r_];
  58.         }
  59.         return res;
  60.     };
  61.    
  62.     auto update = [&] (ll ind, ll val) -> void {
  63.         for (tree[ind += n - 1] += val; ind > 1; ind >>= 1) tree[ind >> 1] = tree[ind] + tree[ind ^ 1];
  64.     };
  65.    
  66.  
  67.     for (ll i = 1, z; i <= q; i++){
  68.         std::cin >> z;
  69.         if (z == 1){
  70.             ll ind, val;
  71.             std::cin >> ind >> val;
  72.             update(rev[ind], val);
  73.         } else {
  74.             ll ind;
  75.             std::cin >> ind;
  76.             std::cout << query(rev[ind], rev[ind] + siz[ind]) << '\n';
  77.         }
  78.     }
  79.  
  80. }
  81.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement