danielvitor23

The Lorax

Nov 8th, 2021
1,548
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.37 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int MAX = 1e5+2;
  5.  
  6. int n, q;
  7. int in[MAX], out[MAX], timer;
  8. vector<int> gr[MAX];
  9. int64_t ft[MAX << 1];
  10.  
  11. void add(int idx, int val) {
  12.   for(; idx <= 2*n; idx += (idx & -idx)) {
  13.     ft[idx] += val;
  14.   }
  15. }
  16.  
  17. int64_t sum(int idx) {
  18.   int64_t _sum = 0;
  19.   for (; idx > 0; idx -= (idx & -idx)) {
  20.     _sum += ft[idx];
  21.   }
  22.   return _sum;
  23. }
  24.  
  25. int64_t query(int l, int r) {
  26.   return sum(r) - sum(l-1);
  27. }
  28.  
  29. void tour(int u, int par = -1) {
  30.   in[u] = ++timer;
  31.   for (int to : gr[u]) if (to != par) {
  32.     tour(to, u);
  33.   }
  34.   out[u] = ++timer;
  35. }
  36.  
  37. int main() {
  38.   cin.tie(0)->sync_with_stdio(0);
  39.   int tc; cin >> tc;
  40.   while (tc--) {
  41.     cin >> n >> q;
  42.     for (int i = 0, u, v; i < n-1; ++i) {
  43.       cin >> u >> v;
  44.       gr[u].push_back(v);
  45.       gr[v].push_back(u);
  46.     }
  47.     tour(1);
  48.     int a, b, x;
  49.     while (q--) {
  50.       cin >> a >> b >> x;
  51.       if (x == 0) {
  52.         int64_t total = query(in[1], out[1]);
  53.         if (in[a] < in[b]) {
  54.           total -= query(in[b], out[b]);
  55.         } else {
  56.           total -= query(in[a], out[a]);
  57.         }
  58.         cout << abs(total) << '\n';
  59.       } else {
  60.         add(in[a], x);
  61.         add(in[b], -x);
  62.       }
  63.     }
  64.     timer = 0;
  65.     for (int i = 1; i <= n; ++i) {
  66.       gr[i].clear();
  67.     }
  68.     for (int i = 1; i <= 2*n; ++i) {
  69.       ft[i] = 0;
  70.     }
  71.   }
  72. }
Advertisement
Add Comment
Please, Sign In to add comment