Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int MAX = 1e5+2;
- int n, q;
- int in[MAX], out[MAX], timer;
- vector<int> gr[MAX];
- int64_t ft[MAX << 1];
- void add(int idx, int val) {
- for(; idx <= 2*n; idx += (idx & -idx)) {
- ft[idx] += val;
- }
- }
- int64_t sum(int idx) {
- int64_t _sum = 0;
- for (; idx > 0; idx -= (idx & -idx)) {
- _sum += ft[idx];
- }
- return _sum;
- }
- int64_t query(int l, int r) {
- return sum(r) - sum(l-1);
- }
- void tour(int u, int par = -1) {
- in[u] = ++timer;
- for (int to : gr[u]) if (to != par) {
- tour(to, u);
- }
- out[u] = ++timer;
- }
- int main() {
- cin.tie(0)->sync_with_stdio(0);
- int tc; cin >> tc;
- while (tc--) {
- cin >> n >> q;
- for (int i = 0, u, v; i < n-1; ++i) {
- cin >> u >> v;
- gr[u].push_back(v);
- gr[v].push_back(u);
- }
- tour(1);
- int a, b, x;
- while (q--) {
- cin >> a >> b >> x;
- if (x == 0) {
- int64_t total = query(in[1], out[1]);
- if (in[a] < in[b]) {
- total -= query(in[b], out[b]);
- } else {
- total -= query(in[a], out[a]);
- }
- cout << abs(total) << '\n';
- } else {
- add(in[a], x);
- add(in[b], -x);
- }
- }
- timer = 0;
- for (int i = 1; i <= n; ++i) {
- gr[i].clear();
- }
- for (int i = 1; i <= 2*n; ++i) {
- ft[i] = 0;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment