Advertisement
prog3r

A (+= on path) AC 780ms

Jun 30th, 2025
474
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.77 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int uint32_t
  4. signed main() {
  5.     ios::sync_with_stdio(0);
  6.     cin.tie(0);
  7.     int n, q;
  8.     cin >> n >> q;
  9.     vector<vector<int>> adj(n);
  10.     for (int i = 0; i < n-1; i += 1) {
  11.         int u, v;
  12.         cin >> u >> v;
  13.         u -= 1, v -= 1;
  14.         adj[u].push_back(v);
  15.         adj[v].push_back(u);
  16.     }
  17.     vector<int> tin1(n), tout1(n), tin2(n), tout2(n);
  18.     int t1 = 0, t2 = 0;
  19.     auto dfs = [&] (auto f, int u, int p) -> void {
  20.         tin1[u] = t1++;
  21.         tin2[u] = t2;
  22.         for (const auto &x : adj[u]) {
  23.             if (x != p) {
  24.                 f(f, x, u);
  25.             }
  26.         }
  27.         tout1[u] = t1-1;
  28.         tout2[u] = t2++;
  29.     };
  30.     dfs(dfs, 0, 0);
  31.     struct Node {
  32.         int val=0;
  33.         int lz=0;
  34.     };
  35.     auto push = [&] (int u, int tl, int tr, vector<Node>& ST) -> void {
  36.         int tm = (tl + tr) >> 1;
  37.         int szl = tm-tl+1;
  38.         int szr = tr-(tm+1)+1;
  39.         ST[2*u+1].lz += ST[u].lz;
  40.         ST[2*u+1].val += ST[u].lz*szl;
  41.         ST[2*u+2].lz += ST[u].lz;
  42.         ST[2*u+2].val += ST[u].lz*szr;
  43.         ST[u].lz = 0;
  44.     };
  45.     auto inc = [&] (auto f, int u, int tl, int tr, int l, int r, int x, vector<Node>& ST) -> void {
  46.         if (tl == l && tr == r) {
  47.             ST[u].val += x*(tr-tl+1);
  48.             ST[u].lz += x;
  49.             return;
  50.         }
  51.         int tm = (tl + tr) >> 1;
  52.         push(u, tl, tr, ST);
  53.         if (l <= tm) {
  54.             f(f, 2*u+1, tl, tm, l, min(r, tm), x, ST);
  55.         }
  56.         if (r >= tm+1) {
  57.             f(f, 2*u+2, tm+1, tr, max(tm+1, l), r, x, ST);
  58.         }
  59.         ST[u].val = ST[2*u+1].val + ST[2*u+2].val;
  60.     };
  61.     auto gt = [&] (auto f, int u, int tl, int tr, int l, int r, vector<Node>& ST) -> int {
  62.         if (tl == l && tr == r) {
  63.             return ST[u].val;
  64.         }
  65.         int tm = (tl + tr) >> 1;
  66.         push(u, tl, tr, ST);
  67.         int ret = 0;
  68.         if (l <= tm) {
  69.             ret += f(f, 2*u+1, tl, tm, l, min(r, tm), ST);
  70.         }
  71.         if (r >= tm+1) {
  72.             ret += f(f, 2*u+2, tm+1, tr, max(tm+1, l), r, ST);
  73.         }
  74.         return ret;
  75.     };
  76.     vector<Node> vals(4*n+10), cancelled(4*n+10);
  77.     int ans = 0;
  78.     for (int ii = 1; ii <= q; ii += 1) {
  79.         int tp, u;
  80.         cin >> tp >> u;
  81.         u -= 1;
  82.         if (tp == 1) {
  83.             inc(inc, 0, 0, n-1, 0, tout1[u], 1, vals);
  84.             if (tout2[u] >= 1) {
  85.                 inc(inc, 0, 0, n-1, 0, tout2[u]-1, 1, cancelled);
  86.             }
  87.         }
  88.         if (tp == 2) {
  89.             ans += gt(gt, 0, 0, n-1, tin1[u], tout1[u], vals)-gt(gt, 0, 0, n-1, tin2[u], tout2[u], cancelled);
  90.         }
  91.         if (ii % 100 == 0) {
  92.             cout << ans << endl;
  93.             ans = 0;
  94.         }
  95.     }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement